mirror of
https://github.com/urbit/shrub.git
synced 2024-12-23 19:05:48 +03:00
298 lines
6.7 KiB
Plaintext
298 lines
6.7 KiB
Plaintext
:: eth-sender: utility for signing & sending eth-txs
|
|
::
|
|
:: usage:
|
|
::
|
|
:: sign txs for gasses of 2 and 11 gwei; (~ for default gwei set)
|
|
:: store at path
|
|
:: :eth-sender [%sign %/txs %/txs/eth-txs %/pk/txt ~[2 0]]
|
|
::
|
|
:: read nonce range from signed transactions at path
|
|
:: :eth-sender [%read %txs/txt]
|
|
::
|
|
:: send all but first 50 txs from path to mainnet,
|
|
:: waiting for confirms every 4 txs
|
|
:: :eth-sender [%send %/txs/txt 4 `index+50 ~]
|
|
::
|
|
/+ ethereum, default-agent, verb
|
|
::
|
|
|%
|
|
++ state-0
|
|
$: %0
|
|
~
|
|
==
|
|
::
|
|
+$ tx-range
|
|
$: how=?(%nonce %index) :: tx nonce / index in file
|
|
wat=$@(@ud [start=@ud end=@ud]) :: inclusive. end optional
|
|
==
|
|
::
|
|
+$ command
|
|
$% [%sign out=path in=path key=path gweis=(list @ud)]
|
|
[%read =path]
|
|
::
|
|
$: %send
|
|
txs=path
|
|
step-size=@ud
|
|
range=(unit tx-range)
|
|
nodes=(list [id=@tas url=@t])
|
|
==
|
|
==
|
|
::
|
|
+$ card card:agent:gall
|
|
--
|
|
::
|
|
=| state-0
|
|
=* state -
|
|
%+ verb |
|
|
=<
|
|
|_ =bowl:gall
|
|
+* this .
|
|
do ~(. +> bowl)
|
|
def ~(. (default-agent this %|) bowl)
|
|
bec byk.bowl(r da+now.bowl)
|
|
::
|
|
++ on-init on-init:def
|
|
++ on-save !>(state)
|
|
++ on-load on-load:def
|
|
::
|
|
++ on-poke
|
|
|= [=mark =vase]
|
|
^- (quip card _this)
|
|
?. ?=(%noun mark) [~ this]
|
|
=/ =command !<(command vase)
|
|
?- -.command
|
|
%read
|
|
~& (read-transactions:do +.command)
|
|
[~ this]
|
|
::
|
|
%sign
|
|
:_ this
|
|
(sign-transactions:do +.command)
|
|
::
|
|
%send
|
|
:_ this
|
|
(send-transactions:do +.command)
|
|
==
|
|
::
|
|
++ on-agent
|
|
|= [=wire =sign:agent:gall]
|
|
^- (quip card _this)
|
|
?. ?=([%send *] wire)
|
|
(on-agent:def wire sign)
|
|
?- -.sign
|
|
%poke-ack
|
|
?~ p.sign
|
|
[~ this]
|
|
%- (slog leaf+"{(trip dap.bowl)} couldn't start thread" u.p.sign)
|
|
:_ this
|
|
[(leave-spider:do wire our.bowl)]~
|
|
::
|
|
%watch-ack
|
|
?~ p.sign
|
|
[~ this]
|
|
=/ =tank leaf+"{(trip dap.bowl)} couldn't start listen to thread"
|
|
%- (slog tank u.p.sign)
|
|
[~ this]
|
|
::
|
|
%kick
|
|
[~ this]
|
|
::
|
|
%fact
|
|
?+ p.cage.sign (on-agent:def wire sign)
|
|
%thread-fail
|
|
=+ !<([=term =tang] q.cage.sign)
|
|
%- (slog leaf+"{(trip dap.bowl)} failed" leaf+<term> tang)
|
|
[~ this]
|
|
::
|
|
%thread-done
|
|
~& ['all submitted to' t.wire]
|
|
[~ this]
|
|
==
|
|
==
|
|
::
|
|
++ on-peek on-peek:def
|
|
++ on-watch on-watch:def
|
|
++ on-leave on-leave:def
|
|
++ on-arvo on-arvo:def
|
|
++ on-fail on-fail:def
|
|
--
|
|
::
|
|
|_ =bowl:gall
|
|
++ bec byk.bowl(r da+now.bowl)
|
|
++ poke-spider
|
|
|= [=path our=@p =cage]
|
|
^- card
|
|
[%pass path %agent [our %spider] %poke cage]
|
|
::
|
|
++ watch-spider
|
|
|= [=path our=@p =sub=path]
|
|
^- card
|
|
[%pass path %agent [our %spider] %watch sub-path]
|
|
::
|
|
++ leave-spider
|
|
|= [=path our=@p]
|
|
^- card
|
|
[%pass path %agent [our %spider] %leave ~]
|
|
::
|
|
++ start-txs-send
|
|
|= [[node-id=@tas node=@t] step=@ud txs=(list @ux)]
|
|
^- (list card)
|
|
=/ tid=@ta
|
|
:((cury cat 3) dap.bowl '--' node-id '--' (scot %uv eny.bowl))
|
|
=/ args [~ `tid bec %eth-send-txs !>([node step txs])]
|
|
:~ (watch-spider /send/[tid] our.bowl /thread-result/[tid])
|
|
(poke-spider /send/[tid] our.bowl %spider-start !>(args))
|
|
==
|
|
::
|
|
::
|
|
++ get-file
|
|
|= =path
|
|
~| path
|
|
.^ (list cord)
|
|
%cx
|
|
(scot %p our.bowl)
|
|
%base
|
|
(scot %da now.bowl)
|
|
path
|
|
==
|
|
::
|
|
++ write-file-wain
|
|
|= [=path tox=(list cord)]
|
|
^- card
|
|
?> ?=([@ desk @ *] path)
|
|
=- [%pass [%write path] %arvo %c %info -]
|
|
:- i.t.path
|
|
=- &+[t.t.t.path -]~
|
|
=/ y .^(arch %cy path)
|
|
?~ fil.y
|
|
ins+txt+!>(tox)
|
|
mut+txt+!>(tox)
|
|
::
|
|
++ write-file-transactions
|
|
|= [=path tox=(list transaction:rpc:ethereum)]
|
|
^- card
|
|
?> ?=([@ desk @ *] path)
|
|
=- [%pass [%write path] %arvo %c %info -]
|
|
:- i.t.path
|
|
=- &+[t.t.t.path -]~
|
|
=/ y .^(arch %cy path)
|
|
?~ fil.y
|
|
ins+eth-txs+!>(tox)
|
|
mut+eth-txs+!>(tox)
|
|
::
|
|
::
|
|
++ read-transactions
|
|
|= =path
|
|
^- tape
|
|
=+ tox=.^((list cord) %cx path)
|
|
=+ [first last]=(read-nonces tox)
|
|
%+ weld
|
|
"Found nonces {(scow %ud first)} through {(scow %ud last)}"
|
|
" in {(scow %ud (lent tox))} transactions."
|
|
::
|
|
++ read-nonces
|
|
|= tox=(list cord)
|
|
|^ ^- [@ud @ud]
|
|
?: =(~ tox) ::NOTE tmi
|
|
[0 0]
|
|
:- (read-nonce (snag 0 tox))
|
|
(read-nonce (snag (dec (lent tox)) tox))
|
|
::
|
|
++ read-nonce
|
|
|= tex=cord
|
|
^- @ud
|
|
%+ snag 0
|
|
%- decode-atoms:rlp:ethereum
|
|
(tape-to-ux (trip tex))
|
|
--
|
|
::
|
|
::
|
|
++ sign-transactions
|
|
|= [out=path in=path key=path gasses=(list @ud)]
|
|
^- (list card)
|
|
%+ turn
|
|
?. =(~ gasses) gasses
|
|
:: default gwei set
|
|
~[4 8 12 20 32]
|
|
|= gas=@ud
|
|
%+ write-file-wain
|
|
:: add gas amount to path
|
|
=+ end=(dec (lent out))
|
|
=- (weld (scag end out) -)
|
|
?: =(0 gas) [(snag end out) /txt]
|
|
:_ /txt
|
|
(cat 3 (snag end out) (crip '-' ((d-co:co 1) gas)))
|
|
::
|
|
%- sign
|
|
:+ in key
|
|
:: modify tx gas if non-zero gwei specified
|
|
?: =(0 gas) ~
|
|
`(mul gas 1.000.000.000)
|
|
::
|
|
++ sign
|
|
=, rpc:ethereum
|
|
|= [in=path key=path gas=(unit @ud)]
|
|
^- (list cord)
|
|
?> ?=([@ @ @ *] key)
|
|
=/ pkf (get-file t.t.t.key)
|
|
?> ?=(^ pkf)
|
|
=/ pk (rash i.pkf ;~(pfix (jest '0x') hex))
|
|
=/ txs .^((list transaction) %cx in)
|
|
=/ enumerated
|
|
=/ n 1
|
|
|- ^- (list [@ud transaction])
|
|
?~ txs
|
|
~
|
|
[[n i.txs] $(n +(n), txs t.txs)]
|
|
%+ turn enumerated
|
|
|= [n=@ud tx=transaction]
|
|
~? =(0 (mod n 100)) [%signing n]
|
|
=? gas-price.tx ?=(^ gas) u.gas
|
|
(crip '0' 'x' ((x-co:co 0) (sign-transaction:key:ethereum tx pk)))
|
|
::
|
|
++ send-transactions
|
|
|= [=path step=@ud range=(unit tx-range) nodes=(list [id=@tas url=@t])]
|
|
^- (list card)
|
|
=? nodes =(~ nodes)
|
|
:~ geth+'http://eth-mainnet.urbit.org:8545'
|
|
==
|
|
~& 'loading txs...'
|
|
=/ tox=(list cord) .^((list cord) %cx path)
|
|
=? tox ?=(^ range)
|
|
(txs-in-range tox u.range)
|
|
=/ txs=(list @ux)
|
|
%+ turn tox
|
|
(cork trip tape-to-ux)
|
|
~& ['sending txs:' (lent txs)]
|
|
%- zing
|
|
%+ turn nodes
|
|
|= node=[@tas @t]
|
|
(start-txs-send node step txs)
|
|
::
|
|
++ txs-in-range
|
|
|= [tox=(list cord) =tx-range]
|
|
^+ tox
|
|
=* ran wat.tx-range
|
|
?- how.tx-range
|
|
%index
|
|
?@ ran
|
|
(slag ran tox)
|
|
%+ slag start.ran
|
|
(scag end.ran tox)
|
|
::
|
|
%nonce
|
|
=+ [first last]=(read-nonces tox)
|
|
?: !=((lent tox) +((sub last first)))
|
|
~| ['probably non-contiguous set of transactions' -]
|
|
!!
|
|
?@ ran
|
|
(slag (sub ran first) tox)
|
|
%+ slag (sub start.ran first)
|
|
(scag (sub +(end.ran) first) tox)
|
|
==
|
|
::
|
|
++ tape-to-ux
|
|
|= t=tape
|
|
(scan t ;~(pfix (jest '0x') hex))
|
|
--
|