mirror of
https://github.com/ilyakooo0/urbit.git
synced 2024-12-13 11:45:45 +03:00
WIP: mostly refactored wallet-hook
This commit is contained in:
parent
b37e2c46ef
commit
976d4f47fa
@ -32,7 +32,7 @@
|
||||
+$ state-0
|
||||
$: %0
|
||||
prov=(unit [host=ship connected=?])
|
||||
reqs=(set request:bws)
|
||||
=reqs
|
||||
=btc-state
|
||||
def-wallet=(unit xpub)
|
||||
fam-limit=@ud
|
||||
@ -176,7 +176,7 @@
|
||||
?. tx-match
|
||||
~[(send-update [%broadcast-tx-mismatch-poym signed.act])]
|
||||
?~ prov ~|("Provider not connected" !!)
|
||||
~[(poke-provider host.u.prov ~ [%broadcast-tx signed.act])]
|
||||
~[(poke-provider host.u.prov [%broadcast-tx signed.act])]
|
||||
::
|
||||
%add-piym
|
||||
?> =(src.bowl our.bowl)
|
||||
@ -204,7 +204,7 @@
|
||||
%close-pym
|
||||
?> =(src.bowl our.bowl)
|
||||
=^ cards state
|
||||
?. included.ti
|
||||
?. included.ti.act
|
||||
`state
|
||||
?: (~(has by pend-piym) txid.ti.act)
|
||||
(piym-to-history ti.act)
|
||||
@ -216,12 +216,25 @@
|
||||
::
|
||||
%fail-broadcast-tx
|
||||
?> =(src.bowl our.bowl)
|
||||
`state
|
||||
:_ state(poym ~)
|
||||
~[(send-update [%broadcast-tx-spent-utxos txid.act])]
|
||||
::
|
||||
%succeed-broadcast-tx
|
||||
?> =(src.bowl our.bowl)
|
||||
`state
|
||||
::
|
||||
:_ %= state
|
||||
poym ~
|
||||
reqs (~(put by reqs) txid.act [%tx-info 0 txid.act])
|
||||
==
|
||||
?~ prov ~
|
||||
:- (poke-provider host.u.prov [%tx-info txid.act])
|
||||
?~ payee.u.poym ~
|
||||
:_ ~
|
||||
%- poke-hook
|
||||
:* u.payee.u.poym
|
||||
%expect-payment
|
||||
txid.act
|
||||
value:(snag 0 txos.u.poym)
|
||||
==
|
||||
:: can't pay yourself; comets can't pay (could spam requests)
|
||||
:: must have default wallet set
|
||||
:: reuses payment address for ship if exists in piym
|
||||
@ -268,7 +281,7 @@
|
||||
?> (piym-matches u.pay)
|
||||
:_ (update-pend-piym txid.act u.pay(pend `txid.act))
|
||||
?~ prov ~
|
||||
~[(get-tx-info host.u.prov txid.act)]
|
||||
~[(poke-provider host.u.prov [%txinfo txid.act])]
|
||||
::
|
||||
++ piym-matches
|
||||
|= p=payment
|
||||
@ -319,57 +332,27 @@
|
||||
|= upd=update:bp
|
||||
^- (quip card _state)
|
||||
?. ?=(%.y -.upd) `state
|
||||
?- -.body.p.upd
|
||||
?- -.p.upd
|
||||
%address-info
|
||||
=/ req=(unit request:bws)
|
||||
(~(get by reqs) req-id.p.upd)
|
||||
?~ req `state
|
||||
?> ?=([%address-info *] u.req)
|
||||
:_ state(reqs (~(del by reqs) req-id.p.upd))
|
||||
:~ %- poke-store
|
||||
:* %address-info xpub.u.req chyg.u.req idx.u.req
|
||||
utxos.body.p.upd used.body.p.upd block.body.p.upd
|
||||
==
|
||||
==
|
||||
:_ state(reqs (~(del by reqs) address.p.upd))
|
||||
~[(poke-store p.upd)]
|
||||
::
|
||||
%tx-info
|
||||
:_ state
|
||||
~[(poke-hook our.bowl [%close-pym info.body.p.upd])]
|
||||
:_ state(reqs (~(del by reqs) txid.info.p.upd))
|
||||
~[(poke-hook our.bowl [%close-pym info.p.upd])]
|
||||
::
|
||||
%raw-tx
|
||||
:_ state
|
||||
~[(poke-hook our.bowl [%add-poym-txi +.body.p.upd])]
|
||||
::
|
||||
:: %broadcast-tx
|
||||
:: TODO: better than provider is to put %txinfo in reqs
|
||||
:: If no provider, return; try again on-reconnect
|
||||
:: If tx is included or broadcast
|
||||
:: - send %expect-payment to peer
|
||||
:: - send a %txinfo request
|
||||
:: If tx it is not included and not broadcast
|
||||
:: - clear poym
|
||||
:: - send a %broadcast-tx-spent-utxos update/error
|
||||
~[(poke-hook our.bowl [%add-poym-txi +.p.upd])]
|
||||
::
|
||||
%broadcast-tx
|
||||
:: IF NO PROVIDER, SEND TX ID TO reqs?
|
||||
=* res body.p.upd
|
||||
?~ prov `state
|
||||
?~ poym `state
|
||||
?. =(~(get-txid txb:bwsl u.poym) txid.res)
|
||||
?. =(~(get-txid txb:bwsl u.poym) txid.p.upd)
|
||||
`state
|
||||
=/ success=? ?|(broadcast.res included.res)
|
||||
:_ ?:(success state state(poym ~))
|
||||
?. success
|
||||
~[(send-update [%broadcast-tx-spent-utxos txid.res])]
|
||||
:: send %tx-info and %expect-payment
|
||||
%+ weld ~[(get-tx-info host.u.prov txid.res)]
|
||||
?~ payee.u.poym ~
|
||||
:_ ~
|
||||
%- poke-hook
|
||||
:* u.payee.u.poym
|
||||
%expect-payment
|
||||
txid.res
|
||||
value:(snag 0 txos.u.poym)
|
||||
==
|
||||
:_ state
|
||||
?: ?|(broadcast.p.upd included.p.upd)
|
||||
~[(poke-hook our.bowl [%succeed-broadcast-tx txid.p.upd])]
|
||||
~[(poke-hook our.bowl [%fail-broadcast-tx txid.p.upd])]
|
||||
==
|
||||
::
|
||||
++ handle-wallet-store-request
|
||||
@ -382,16 +365,14 @@
|
||||
==
|
||||
?- -.req
|
||||
%address-info
|
||||
:_ state(req (~(put in reqs) req))
|
||||
?: should-send
|
||||
~[(get-address-info ri host.u.prov a.req)]
|
||||
~
|
||||
:_ state(reqs (~(put by reqs) a.req req))
|
||||
?. should-send ~
|
||||
~[(poke-provider host.u.prov [%address-info a.req])]
|
||||
::
|
||||
%tx-info
|
||||
:: TODO: push the request out
|
||||
:: put it in reqs
|
||||
:: check whether last-block has passed
|
||||
`state
|
||||
:_ state(reqs (~(put by reqs) txid.req req))
|
||||
?. should-send ~
|
||||
~[(poke-provider host.u.prov [%tx-info txid.req])]
|
||||
==
|
||||
::
|
||||
++ handle-wallet-store-update
|
||||
@ -564,15 +545,14 @@
|
||||
|= [latest-block=@ud]
|
||||
^- (list card)
|
||||
?~ prov ~|("provider not set" !!)
|
||||
%+ murn ~(tap by reqs)
|
||||
|= [ri=req-id:bp req=request:bws]
|
||||
%+ murn ~(val by reqs)
|
||||
|= [req=request:bws]
|
||||
?: (gte last-block.req latest-block) ~
|
||||
:- ~
|
||||
%+ poke-provider host.u.prov
|
||||
?- -.req
|
||||
%address-info
|
||||
`(get-address-info ri host.u.prov a.req)
|
||||
::
|
||||
%tx-info
|
||||
`(get-tx-info host.u.prov txid.req)
|
||||
%address-info [%address-info a.req]
|
||||
%tx-info [%tx-info txid.req]
|
||||
==
|
||||
::
|
||||
++ retry-poym
|
||||
@ -582,7 +562,7 @@
|
||||
=* host host.u.prov
|
||||
%+ weld
|
||||
?~ sitx.u.poym ~
|
||||
~[(poke-prov host ~ [%broadcast-tx u.sitx.u.poym])]
|
||||
~[(poke-provider host [%broadcast-tx u.sitx.u.poym])]
|
||||
%+ turn txis.u.poym
|
||||
|= =txi:bws
|
||||
(get-raw-tx host txid.utxo.txi)
|
||||
@ -592,29 +572,18 @@
|
||||
^- (list card)
|
||||
?~ prov ~|("provider not set" !!)
|
||||
%+ turn ~(tap in ~(key by pend-piym))
|
||||
|=(=txid (get-tx-info host.u.prov txid))
|
||||
::
|
||||
++ get-address-info
|
||||
|= [ri=req-id:bp host=ship a=address]
|
||||
^- card
|
||||
(poke-provider host `ri [%address-info a])
|
||||
|=(=txid (poke-provider host.u.prov [%txinfo txid]))
|
||||
::
|
||||
++ get-raw-tx
|
||||
|= [host=ship =txid]
|
||||
^- card
|
||||
(poke-provider host ~ [%raw-tx txid])
|
||||
::
|
||||
++ get-tx-info
|
||||
|= [host=ship =txid]
|
||||
^- card
|
||||
(poke-provider host ~ [%tx-info txid])
|
||||
(poke-provider host [%raw-tx txid])
|
||||
::
|
||||
++ poke-provider
|
||||
|= [host=ship uri=(unit req-id:bp) actb=action-body:bp]
|
||||
|= [host=ship act=action:bp]
|
||||
^- card
|
||||
=+ ri=?^(uri u.uri (gen-req-id:bp eny.bowl))
|
||||
:* %pass /[(scot %da now.bowl)] %agent [host %btc-provider]
|
||||
%poke %btc-provider-action !>([ri actb])
|
||||
%poke %btc-provider-action !>([act])
|
||||
==
|
||||
::
|
||||
++ broadcasting
|
||||
|
@ -109,7 +109,8 @@
|
||||
==
|
||||
++ address-info
|
||||
%- ot:dejs:format
|
||||
:~ [%utxos (as:dejs:format utxo)]
|
||||
:~ [%address (cu:dejs:format address-from-cord so:dejs:format)]
|
||||
[%utxos (as:dejs:format utxo)]
|
||||
[%used bo:dejs:format]
|
||||
[%block ni:dejs:format]
|
||||
==
|
||||
|
@ -13,7 +13,7 @@
|
||||
[%ping ~]
|
||||
==
|
||||
+$ result
|
||||
$% [%address-info utxos=(set utxo) used=? block=@ud]
|
||||
$% [%address-info =address utxos=(set utxo) used=? block=@ud]
|
||||
[%tx-info =info:tx]
|
||||
[%raw-tx =txid =rawtx]
|
||||
[%broadcast-tx =txid broadcast=? included=?]
|
||||
@ -33,7 +33,7 @@
|
||||
++ rpc-types
|
||||
|%
|
||||
+$ action
|
||||
$% [%get-address-info =address]
|
||||
$% [%get-address-info =address]
|
||||
[%get-tx-vals =txid]
|
||||
[%get-raw-tx =txid]
|
||||
[%broadcast-tx =rawtx]
|
||||
@ -42,7 +42,7 @@
|
||||
==
|
||||
::
|
||||
+$ result
|
||||
$% [%get-address-info utxos=(set utxo) used=? block=@ud]
|
||||
$% [%get-address-info =address utxos=(set utxo) used=? block=@ud]
|
||||
[%get-tx-vals =info:tx]
|
||||
[%get-raw-tx =txid =rawtx]
|
||||
[%create-raw-tx =rawtx]
|
||||
|
@ -1,10 +1,8 @@
|
||||
/- *btc, bws=btc-wallet-store, bp=btc-provider
|
||||
|%
|
||||
:: btc-state: state from the provider; t is last update time
|
||||
:: req-id: hash of [xpub chyg idx]
|
||||
:: reqs: lookup of req-id -> requests from wallet-store+blockcount
|
||||
:: blockcount included so that we only request address info when
|
||||
:: there's a newer block, in the case of addresses we are cooking
|
||||
:: reqs: last block checked for an address/tx request to provider.
|
||||
:: Used to determine whether to retry request
|
||||
::
|
||||
:: payment: a payment expected from another ship
|
||||
:: - address: address generated for this payment
|
||||
@ -13,8 +11,9 @@
|
||||
:: pend-piym: incoming payment txs that peer says they have broadcast
|
||||
:: poym: outgoing payments. One at a time: new replaces old
|
||||
::
|
||||
+$ btc-state [block=@ud fee=sats t=@da]
|
||||
+$ reqs (map req-id:bp req=request:bws)
|
||||
+$ block @ud
|
||||
+$ btc-state [=block fee=sats t=@da]
|
||||
+$ reqs (map $?(address txid) request:bws)
|
||||
::
|
||||
+$ payment [pend=(unit txid) =xpub =address payer=ship value=sats]
|
||||
+$ piym [ps=(map ship payment) num-fam=(map ship @ud)]
|
||||
@ -46,9 +45,8 @@
|
||||
[%add-poym =txbu:bws]
|
||||
[%add-poym-txi =txid =rawtx]
|
||||
[%close-pym ti=info:tx]
|
||||
:: from %broadcast-tx
|
||||
[%fail-broadcast-tx =txid] :: clear poym; remove from wallet-history?
|
||||
[%succeed-broadcast-tx =txid] :: p
|
||||
[%fail-broadcast-tx =txid]
|
||||
[%succeed-broadcast-tx =txid]
|
||||
==
|
||||
+$ peer
|
||||
$% [%gen-pay-address value=sats]
|
||||
|
@ -89,7 +89,7 @@
|
||||
::
|
||||
+$ action
|
||||
$% [%add-wallet =xpub =fprint scan-to=(unit scon) max-gap=(unit @ud) confs=(unit @ud)]
|
||||
[%address-info =xpub =chyg =idx utxos=(set utxo) used=? block=@ud]
|
||||
[%address-info =address utxos=(set utxo) used=? block=@ud]
|
||||
[%tx-info =info:tx block=@ud]
|
||||
[%generate-address =xpub =chyg =pmet]
|
||||
[%generate-txbu =xpub payee=(unit ship) feyb=sats txos=(list txo)]
|
||||
@ -106,7 +106,7 @@
|
||||
:: last-block: most recent block this address was checked
|
||||
::
|
||||
+$ request
|
||||
$% [%address-info last-block=@ud a=address =xpub =chyg =idx]
|
||||
$% [%address-info last-block=@ud a=address]
|
||||
[%tx-info last-block=@ud =txid]
|
||||
==
|
||||
--
|
||||
|
Loading…
Reference in New Issue
Block a user