shrub/lib/btc-wallet-store.hoon

102 lines
2.5 KiB
Plaintext
Raw Normal View History

2020-10-31 14:25:32 +03:00
::
::
2020-10-30 14:45:38 +03:00
/- *btc-wallet-store
/+ bip32, btc
=, secp:crypto
=+ ecc=secp256k1
|%
2020-11-13 15:47:11 +03:00
++ defaults
|%
++ max-gap 20
++ confs 6
--
2020-11-02 10:21:48 +03:00
::
2020-11-05 10:51:17 +03:00
++ hash-xpub
|= [=xpub:btc =chyg =idx]
^- @ux
=/ chygidx=@ (cat 3 ?:(=(%0 chyg) '0' '1') idx)
=/ dat=@ (cat 3 xpub chygidx)
%- ripemd-160:ripemd:crypto
[(met 3 dat) dat]
2020-11-11 15:30:22 +03:00
::
++ from-xpub
2020-11-13 15:47:11 +03:00
|= [=xpub:btc scan-to=(unit scon) max-gap=(unit @ud) confs=(unit @ud)]
2020-11-11 15:30:22 +03:00
^- walt
:* (from-extended:bip32 (trip xpub))
(xpub-type:btc xpub)
*wach
[0 0]
%.n
(fall scan-to *scon)
2020-11-13 15:47:11 +03:00
(fall max-gap max-gap:defaults)
(fall confs confs:defaults)
2020-11-11 15:30:22 +03:00
==
:: wad: door for processing walts (wallets)
:: parameterized on a walt and it's chyg account
::
++ wad
|_ [w=walt =chyg]
2020-10-31 14:25:32 +03:00
++ mk-address
2020-11-02 10:21:48 +03:00
|= =idx
2020-10-30 14:45:38 +03:00
^- address:btc
=/ pubkey=@ux
%- compress-point:ecc
2020-11-11 15:30:22 +03:00
pub:(derive-public:(derive-public:wilt.w (@ chyg)) idx)
?: ?=(%bip84 bipt.w)
2020-10-30 14:45:38 +03:00
(need (encode-pubkey:bech32:btc %main pubkey))
~|("legacy addresses not supported yet " !!)
:: generates and watches the next available address
::
++ gen-address
2020-11-11 15:30:22 +03:00
^- (pair address:btc walt)
=/ addr (mk-address nixt-idx)
:- addr
(watch-address addr [chyg nixt-idx *(set utxo:btc)])
2020-10-31 14:25:32 +03:00
:: insert a new address; update "nixt" free address if this one was it
::
++ watch-address
2020-10-31 14:25:32 +03:00
|= [a=address:btc =addi]
2020-11-11 15:30:22 +03:00
^- walt
2020-11-02 10:21:48 +03:00
?> =(chyg chyg.addi)
?> =(a (mk-address idx.addi))
2020-11-11 15:30:22 +03:00
=? nixt.w (is-nixt addi)
2020-11-02 10:21:48 +03:00
new:bump-nixt
2020-11-11 15:30:22 +03:00
w(wach (~(put by wach.w) a addi))
:: update an address if it's in wach map
2020-10-31 12:41:00 +03:00
::
++ update-address
2020-10-31 14:25:32 +03:00
|= [a=address:btc utxos=(set utxo:btc)]
2020-11-11 15:30:22 +03:00
^- walt
2020-10-31 12:41:00 +03:00
=/ adi=(unit addi)
2020-11-11 15:30:22 +03:00
(~(get by wach.w) a)
?~ adi w
w(wach (~(put by wach.w) a u.adi(utxos utxos)))
2020-10-31 14:25:32 +03:00
::
++ is-nixt
2020-11-02 10:21:48 +03:00
|= =addi ^- ?
?: ?=(%0 chyg.addi)
2020-11-11 15:30:22 +03:00
=(idx.addi p.nixt.w)
=(idx.addi q.nixt.w)
2020-11-02 13:37:55 +03:00
++ nixt-idx
2020-11-11 15:30:22 +03:00
?:(?=(%0 chyg) p.nixt.w q.nixt.w)
2020-11-02 10:21:48 +03:00
:: Returns: the prior idx in the account
:: nixt with account idx bumped
2020-11-02 13:37:55 +03:00
:: Increments idx until an unwatched address is found
2020-11-02 10:21:48 +03:00
:: Crashes if max-index is passed
2020-10-31 12:41:00 +03:00
::
2020-10-31 14:25:32 +03:00
++ bump-nixt
2020-11-02 10:21:48 +03:00
|^ ^- [old=idx new=nixt]
2020-11-02 13:37:55 +03:00
:- nixt-idx
=/ new-idx=idx +(nixt-idx)
2020-10-31 14:25:32 +03:00
|- ?> (lte new-idx max-index)
2020-11-11 15:30:22 +03:00
?. (~(has by wach.w) (mk-address new-idx))
2020-11-02 10:21:48 +03:00
(set-nixt new-idx)
2020-10-31 14:25:32 +03:00
$(new-idx +(new-idx))
2020-11-02 10:21:48 +03:00
::
++ set-nixt
|= idx=@ ^- nixt
2020-11-11 15:30:22 +03:00
?:(?=(%0 chyg) [idx q.nixt.w] [p.nixt.w idx])
2020-11-02 10:21:48 +03:00
--
2020-10-30 14:45:38 +03:00
--
--