From 978f434879d0da18b6d0b0c94273ec093d87e54b Mon Sep 17 00:00:00 2001 From: timlucmiptev Date: Fri, 4 Dec 2020 12:29:12 +0200 Subject: [PATCH] send for scanning if not done --- app/btc-wallet-store.hoon | 70 ++++++++++++++++++++++++++++++--------- sur/btc-provider.hoon | 1 + sur/btc-wallet-store.hoon | 6 ++-- 3 files changed, 59 insertions(+), 18 deletions(-) diff --git a/app/btc-wallet-store.hoon b/app/btc-wallet-store.hoon index 77147ecb67..23f6d3e3ee 100644 --- a/app/btc-wallet-store.hoon +++ b/app/btc-wallet-store.hoon @@ -27,7 +27,6 @@ $: %0 walts=(map xpub:btc walt) =scans - =gena batch-size=@ud last-block=@ud == @@ -48,7 +47,7 @@ ++ on-init ^- (quip card _this) ~& > '%btc-wallet-store initialized' - `this(state [%0 *(map xpub:btc walt) *^scans *^gena max-gap:defaults 0]) + `this(state [%0 *(map xpub:btc walt) *^scans max-gap:defaults 0]) ++ on-save ^- vase !>(state) @@ -115,13 +114,7 @@ (update-address +.act) :: %generate-address - =+ uw=(~(get by walts) xpub.act) - ?~ uw - ~|("btc-wallet-store: non-existent xpub" !!) - =/ [a=address:btc w=walt] - ~(gen-address wad u.uw chyg.act) - :_ state(walts (~(put by walts) xpub.act w)) - ~[(send-update [%generate-address a meta.act])] + (generate-address +.act) :: %generate-txbu =+ w=(~(get by walts) xpub.act) @@ -223,13 +216,15 @@ (bump-batch xpub %1) :- (weld cards0 cards1) state(scans (insert-batches xpub batch0 batch1)) -:: watch the address passed, update wallet if it's used -:: if this idx was the last in todo.scans, do run-scan to see whether scan is done -:: updates wallet-store state to have last-block +:: +update-address: watch the address passed; update wallet if it's used +:: - if address is unused, send %address-info request to monitor it +:: - if address doesn't have enough confs, send %address-info request to monitor it +:: - if this idx was the last in todo.scans, do run-scan to see whether scan is done +:: - updates wallet-store state to have last-block :: ++ update-address |= [=xpub:btc =chyg =idx utxos=(set utxo) used=? last-block=@ud] - ^- (quip card _state) + |^ ^- (quip card _state) =? state (gth last-block last-block.state) state(last-block last-block) =/ w=(unit walt) (~(get by walts) xpub) @@ -246,9 +241,48 @@ ?~ b `state =. scans (iter-scan u.b(has-used ?|(used has-used.u.b)) xpub chyg idx) + :: if address is not used or utxos aren't conf'd, send more-info request + :: ?: empty:(scan-status xpub chyg) - (run-scan xpub) - `state + =^ cards state (run-scan xpub) + [(weld (more-info u.w) cards) state] + [(more-info u.w) state] + :: + ++ more-info + |= w=walt + ^- (list card) + ?: (is-done w) ~ + :~ + %- send-request + :* %address-info last-block + (~(mk-address wad w chyg) idx) + xpub chyg idx + == + == + :: + ++ is-done + |= w=walt + ?& used + %+ levy (turn ~(tap in utxos) num-confs) + |=(nc=@ud (gte nc confs:w)) + == + :: + ++ num-confs + |= =utxo:btc + ?: =(0 height.utxo) 0 + (add 1 (sub last-block height.utxo)) + -- +:: +generate-address: generate and return address +:: +++ generate-address + |= [=xpub =chyg meta=(unit [payer=ship value=sats])] + =+ uw=(~(get by walts) xpub) + ?~ uw + ~|("btc-wallet-store: non-existent xpub" !!) + =/ [addr=address:btc w=walt] + ~(gen-address wad u.uw chyg) + :- ~[(send-update [%generate-address addr meta])] + state(walts (~(put by walts) xpub w)) :: ++ scanned-wallets ^- (list xpub) @@ -271,6 +305,12 @@ add (roll values add) :: +++ send-request + |= req=request ^- card + :* %give %fact ~[/requests] + %btc-wallet-store-request !>(req) + == +:: ++ send-update |= upd=update ^- card [%give %fact ~[/updates] %btc-wallet-store-update !>(upd)] diff --git a/sur/btc-provider.hoon b/sur/btc-provider.hoon index 92ac30c03f..fa7456a736 100644 --- a/sur/btc-provider.hoon +++ b/sur/btc-provider.hoon @@ -42,6 +42,7 @@ :: +$ response $% [%get-address-info utxos=(set utxo) used=? block=@ud] + [%create-psbt psbt=cord] [%get-raw-tx =txid =rawtx] [%get-block-count block=@ud] [%get-block-and-fee block=@ud fee=sats] diff --git a/sur/btc-wallet-store.hoon b/sur/btc-wallet-store.hoon index 79a245f15d..19e432ed70 100644 --- a/sur/btc-wallet-store.hoon +++ b/sur/btc-wallet-store.hoon @@ -9,7 +9,9 @@ :: chyg: whether account is (non-)change. 0 or 1 :: idx: an address_index :: nixt: next indices to generate addresses from (non-change/change) -:: addi: address with metadata inside a change path +:: addi: HD path along with UTXOs +:: - poll: whether wallet should keep checking this address +:: used for newly generated addresses to watch them :: wach: map for watched addresses. :: Membership implies the address is known by outside parties or had prior activity :: scon: indices to initially scan to in (non-)change accounts @@ -54,11 +56,9 @@ :: scanning addresses and monitoring generated addresses :: batch: indexes to scan for a given chyg :: scans: all scans underway (batches) -:: gena: any generated address that hasn't had activity yet :: +$ batch [todo=(set idx) endpoint=idx has-used=?] +$ scans (map [xpub chyg] batch) -+$ gena (set address) :: :: %add-wallet: add wallet to state and initiate a scan :: %address-info: give new data about an address.