urbit/WALLET.scratch.md
2021-05-26 18:30:12 -07:00

2.8 KiB

btc-wallet-* Scratch Code

xpub

=xpub1 'zpub6r8dKyWJ31XF6n69KKeEwLjVC5ruqAbiJ4QCqLsrV36Mvx9WEjUaiPNPGFLHNCCqgCdy6iZC8ZgHsm6a1AUTVBMVbKGemNcWFcwBGSjJKbD'
=xpub2 'xpub6D7yaZieZEeG617UcKXDhbsDeso6bmxSAiGWkvkASoiwcjaRtrH5HeNRnDT25s7zmxYzj6MtFe32dVqcf9YcBKKgn9THHjwn2uSjkvobK4e'
=bl -build-file %/lib/btc-wallet-store/hoon

add

:btc-wallet-store|action [%add-wallet xpub ~ ~]

get address at indices

=walt1 (from-xpub:walt:bl xpub1 ~ ~)
(get-address:walt1 %0 0)

update address data

=walt1 (from-xpub:walt:bl xpub1 ~ ~)
(mk-address:walt1 %0 0)
::  gives bc1q0adfj7ur750hjwufzzlfj5ytqzsnd7fz9fjuzc
=walt1 (insert-address:walt1 [%bech32 'bc1q0adfj7ur750hjwufzzlfj5ytqzsnd7fz9fjuzc'] [%0 0 ~])
nixt:walt1
::  gives [p=1 q=0] (nixt updated since it was 0)
=walt1 (insert-address:walt1 [%bech32 'bc1qa5jcdww8u8493zttjjf6q5wu89e6knpvmsh7x4'] [%0 2 ~])
nixt:walt1
::  gives [p=1 q=0] (no update)
=walt1 (insert-address:walt1 [%bech32 'bc1qvqrdh8suyv63ntaa0d7hmcamavv8283sngh6e5'] [%0 1 ~])
nixt:walt1
::  gives [p=3 q=0]  (skips index 2, since already a used address there)

Algos

Insert an address

  1. send wallet an address that we KNOW is in the wallet
  2. include the address's index

Scan addresses. (map xpub (pair list list)) outgoing wire is /scan/xpub/change/index

  • keep list of whether we've heard back on an address (list (unit used))
  • every time we get a response
    • insert the address into the wallet if it's used
    • check whether (lent (murn l)) == max-gap
    • if it does, run lien--if any used, continue
    • if none used, the wallet is scanned.

scratch code, refactor

++ update-utxos |= [a=address:btc us=(set utxo)] ^- (quip card _state) =/ xpubs=(list tape) %~ tap in ~(key by walts.state) |- ?~ xpubs state =/ w=walt (~(got by walts.state) i.xpubs) ?: (~(has by wach.w) a) %: send-address-update i.xpubs (update-wallet w a us) a us == $(xpubs t.xpubs) :: ++ update-wallet |= [w=walt a=address:btc us=(set utxo)] ^- walt =/ curr-addi=addi (~(got by wach.w) a) w(wach (~(put by wach.w) a curr-addi(used %.y, utxos us))) :: ++ send-address-update |= [xpub=tape =walt a=address:btc us=(set utxo)] ^- (quip card _state) :_ state(walts (~(put by walts.state) xpub walt)) ~[[%give %fact ~[/wallets] %btc-wallet-store-update !>([%address a us])]] :: ++ add-wallet |= [xpub=tape scan-to=(unit scon) max-gap=(unit @)] ^- (quip card _state) ?: (~(has by walts.state) xpub) ~& >>> "xpub already imported" state =/ wallet=walt :* (from-extended:bip32 xpub) (xpub-type:btc xpub) *wach [0 0] %.n (fall scan-to *scon) (fall max-gap max-gap.state) == `state(walts (~(put by walts.state) xpub wallet))