mirror of
https://github.com/ilyakooo0/urbit.git
synced 2025-01-06 23:16:29 +03:00
eth: move eth-watcher's request-rpc into ethio lib
Once this is more fully featured, /app/claz could be refactored with it.
This commit is contained in:
parent
a020f184ef
commit
848805e007
@ -1,7 +1,7 @@
|
|||||||
:: eth-watcher: ethereum event log collector
|
:: eth-watcher: ethereum event log collector
|
||||||
::
|
::
|
||||||
/- *eth-watcher
|
/- *eth-watcher
|
||||||
/+ tapp, stdio
|
/+ tapp, stdio, ethio
|
||||||
=, ethereum-types
|
=, ethereum-types
|
||||||
=, able:jael
|
=, able:jael
|
||||||
=> |%
|
=> |%
|
||||||
@ -46,112 +46,18 @@
|
|||||||
==
|
==
|
||||||
++ tapp-async tapp-async:tapp
|
++ tapp-async tapp-async:tapp
|
||||||
++ stdio (^stdio out-poke-data out-peer-data)
|
++ stdio (^stdio out-poke-data out-peer-data)
|
||||||
|
++ ethio (^ethio out-poke-data out-peer-data)
|
||||||
--
|
--
|
||||||
::
|
::
|
||||||
:: Async helpers
|
:: Async helpers
|
||||||
::
|
::
|
||||||
=> |%
|
=> |%
|
||||||
++ request-rpc
|
|
||||||
|= [url=@ta id=(unit @t) req=request:rpc:ethereum]
|
|
||||||
=/ m (async:stdio ,json)
|
|
||||||
^- form:m
|
|
||||||
%+ (retry json) `10
|
|
||||||
=/ m (async:stdio ,(unit json))
|
|
||||||
^- form:m
|
|
||||||
|^
|
|
||||||
=/ =request:http
|
|
||||||
:* method=%'POST'
|
|
||||||
url=url
|
|
||||||
header-list=['Content-Type'^'application/json' ~]
|
|
||||||
^= body
|
|
||||||
%- some %- as-octt:mimes:html
|
|
||||||
%- en-json:html
|
|
||||||
(request-to-json:rpc:ethereum id req)
|
|
||||||
==
|
|
||||||
;< ~ bind:m (send-request:stdio request)
|
|
||||||
;< rep=(unit client-response:iris) bind:m
|
|
||||||
take-maybe-response:stdio
|
|
||||||
?~ rep
|
|
||||||
(pure:m ~)
|
|
||||||
(parse-response u.rep)
|
|
||||||
::
|
|
||||||
++ parse-response
|
|
||||||
|= =client-response:iris
|
|
||||||
=/ m (async:stdio ,(unit json))
|
|
||||||
^- form:m
|
|
||||||
?> ?=(%finished -.client-response)
|
|
||||||
?~ full-file.client-response
|
|
||||||
(pure:m ~)
|
|
||||||
=/ body=@t q.data.u.full-file.client-response
|
|
||||||
=/ jon=(unit json) (de-json:html body)
|
|
||||||
?~ jon
|
|
||||||
(pure:m ~)
|
|
||||||
=, dejs-soft:format
|
|
||||||
=/ array=(unit (list response:rpc:jstd))
|
|
||||||
((ar parse-one-response) u.jon)
|
|
||||||
?~ array
|
|
||||||
=/ res=(unit response:rpc:jstd) (parse-one-response u.jon)
|
|
||||||
?~ res
|
|
||||||
(async-fail:stdio %request-rpc-parse-error >id< ~)
|
|
||||||
?: ?=(%error -.u.res)
|
|
||||||
(async-fail:stdio %request-rpc-error >id< >+.res< ~)
|
|
||||||
?. ?=(%result -.u.res)
|
|
||||||
(async-fail:stdio %request-rpc-fail >u.res< ~)
|
|
||||||
(pure:m `res.u.res)
|
|
||||||
(async-fail:stdio %request-rpc-batch >%not-implemented< ~)
|
|
||||||
:: (pure:m `[%batch u.array])
|
|
||||||
::
|
|
||||||
++ parse-one-response
|
|
||||||
|= =json
|
|
||||||
^- (unit response:rpc:jstd)
|
|
||||||
=/ res=(unit [@t ^json])
|
|
||||||
%. json
|
|
||||||
=, dejs-soft:format
|
|
||||||
(ot id+so result+some ~)
|
|
||||||
?^ res `[%result u.res]
|
|
||||||
~| parse-one-response=json
|
|
||||||
:+ ~ %error %- need
|
|
||||||
%. json
|
|
||||||
=, dejs-soft:format
|
|
||||||
(ot id+so error+(ot code+no message+so ~) ~)
|
|
||||||
--
|
|
||||||
::
|
|
||||||
++ retry
|
|
||||||
|* result=mold
|
|
||||||
|= [crash-after=(unit @ud) computation=_*form:(async:stdio (unit result))]
|
|
||||||
=/ m (async:stdio ,result)
|
|
||||||
=| try=@ud
|
|
||||||
|^
|
|
||||||
|- ^- form:m
|
|
||||||
=* loop $
|
|
||||||
?: =(crash-after `try)
|
|
||||||
(async-fail:stdio %retry-too-many ~)
|
|
||||||
;< ~ bind:m (backoff try ~m1)
|
|
||||||
;< res=(unit result) bind:m computation
|
|
||||||
?^ res
|
|
||||||
(pure:m u.res)
|
|
||||||
loop(try +(try))
|
|
||||||
::
|
|
||||||
++ backoff
|
|
||||||
|= [try=@ud limit=@dr]
|
|
||||||
=/ m (async:stdio ,~)
|
|
||||||
^- form:m
|
|
||||||
;< eny=@uvJ bind:m get-entropy:stdio
|
|
||||||
;< now=@da bind:m get-time:stdio
|
|
||||||
%- wait:stdio
|
|
||||||
%+ add now
|
|
||||||
%+ min limit
|
|
||||||
?: =(0 try) ~s0
|
|
||||||
%+ add
|
|
||||||
(mul ~s1 (bex (dec try)))
|
|
||||||
(mul ~s0..0001 (~(rad og eny) 1.000))
|
|
||||||
--
|
|
||||||
::
|
|
||||||
++ get-latest-block
|
++ get-latest-block
|
||||||
|= url=@ta
|
|= url=@ta
|
||||||
=/ m (async:stdio ,block)
|
=/ m (async:stdio ,block)
|
||||||
^- form:m
|
^- form:m
|
||||||
;< =json bind:m (request-rpc url `'block number' %eth-block-number ~)
|
;< =json bind:m
|
||||||
|
(request-rpc:ethio url `'block number' %eth-block-number ~)
|
||||||
(get-block-by-number url (parse-eth-block-number:rpc:ethereum json))
|
(get-block-by-number url (parse-eth-block-number:rpc:ethereum json))
|
||||||
::
|
::
|
||||||
++ get-block-by-number
|
++ get-block-by-number
|
||||||
@ -160,7 +66,9 @@
|
|||||||
^- form:m
|
^- form:m
|
||||||
|^
|
|^
|
||||||
;< =json bind:m
|
;< =json bind:m
|
||||||
(request-rpc url `'block by number' %eth-get-block-by-number number |)
|
%+ request-rpc:ethio url
|
||||||
|
:- `'block by number'
|
||||||
|
[%eth-get-block-by-number number |]
|
||||||
=/ =block (parse-block json)
|
=/ =block (parse-block json)
|
||||||
?. =(number number.id.block)
|
?. =(number number.id.block)
|
||||||
(async-fail:stdio %reorg-detected >number< >block< ~)
|
(async-fail:stdio %reorg-detected >number< >block< ~)
|
||||||
@ -186,7 +94,7 @@
|
|||||||
=/ m (async:stdio loglist)
|
=/ m (async:stdio loglist)
|
||||||
^- form:m
|
^- form:m
|
||||||
;< =json bind:m
|
;< =json bind:m
|
||||||
%+ request-rpc url
|
%+ request-rpc:ethio url
|
||||||
:* `'logs by hash'
|
:* `'logs by hash'
|
||||||
%eth-get-logs-by-hash
|
%eth-get-logs-by-hash
|
||||||
hash
|
hash
|
||||||
@ -206,7 +114,7 @@
|
|||||||
=/ m (async:stdio loglist)
|
=/ m (async:stdio loglist)
|
||||||
^- form:m
|
^- form:m
|
||||||
;< =json bind:m
|
;< =json bind:m
|
||||||
%+ request-rpc url
|
%+ request-rpc:ethio url
|
||||||
:* `'logs by range'
|
:* `'logs by range'
|
||||||
%eth-get-logs
|
%eth-get-logs
|
||||||
`number+from-number
|
`number+from-number
|
||||||
|
105
pkg/arvo/lib/ethio.hoon
Normal file
105
pkg/arvo/lib/ethio.hoon
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
:: ethio: Asynchronous Ethereum input/output functions.
|
||||||
|
::.
|
||||||
|
/+ stdio
|
||||||
|
::
|
||||||
|
|* [out-poke-data=mold out-peer-data=mold]
|
||||||
|
=> |%
|
||||||
|
++ stdio (^stdio out-poke-data out-peer-data)
|
||||||
|
--
|
||||||
|
|%
|
||||||
|
:: +request-rpc: send rpc request, with retry
|
||||||
|
::
|
||||||
|
++ request-rpc
|
||||||
|
|= [url=@ta id=(unit @t) req=request:rpc:ethereum]
|
||||||
|
=/ m (async:stdio ,json)
|
||||||
|
^- form:m
|
||||||
|
|^ %+ (retry json) `10
|
||||||
|
=/ m (async:stdio ,(unit json))
|
||||||
|
^- form:m
|
||||||
|
=/ =request:http
|
||||||
|
:* method=%'POST'
|
||||||
|
url=url
|
||||||
|
header-list=['Content-Type'^'application/json' ~]
|
||||||
|
^= body
|
||||||
|
%- some %- as-octt:mimes:html
|
||||||
|
%- en-json:html
|
||||||
|
(request-to-json:rpc:ethereum id req)
|
||||||
|
==
|
||||||
|
;< ~ bind:m (send-request:stdio request)
|
||||||
|
;< rep=(unit client-response:iris) bind:m
|
||||||
|
take-maybe-response:stdio
|
||||||
|
?~ rep
|
||||||
|
(pure:m ~)
|
||||||
|
(parse-response u.rep)
|
||||||
|
::
|
||||||
|
++ retry
|
||||||
|
|* result=mold
|
||||||
|
|= [crash-after=(unit @ud) computation=_*form:(async:stdio (unit result))]
|
||||||
|
=/ m (async:stdio ,result)
|
||||||
|
=| try=@ud
|
||||||
|
|^ |- ^- form:m
|
||||||
|
=* loop $
|
||||||
|
?: =(crash-after `try)
|
||||||
|
(async-fail:stdio %retry-too-many ~)
|
||||||
|
;< ~ bind:m (backoff try ~m1)
|
||||||
|
;< res=(unit result) bind:m computation
|
||||||
|
?^ res
|
||||||
|
(pure:m u.res)
|
||||||
|
loop(try +(try))
|
||||||
|
::
|
||||||
|
++ backoff
|
||||||
|
|= [try=@ud limit=@dr]
|
||||||
|
=/ m (async:stdio ,~)
|
||||||
|
^- form:m
|
||||||
|
;< eny=@uvJ bind:m get-entropy:stdio
|
||||||
|
;< now=@da bind:m get-time:stdio
|
||||||
|
%- wait:stdio
|
||||||
|
%+ add now
|
||||||
|
%+ min limit
|
||||||
|
?: =(0 try) ~s0
|
||||||
|
%+ add
|
||||||
|
(mul ~s1 (bex (dec try)))
|
||||||
|
(mul ~s0..0001 (~(rad og eny) 1.000))
|
||||||
|
--
|
||||||
|
::
|
||||||
|
++ parse-response
|
||||||
|
|= =client-response:iris
|
||||||
|
=/ m (async:stdio ,(unit json))
|
||||||
|
^- form:m
|
||||||
|
?> ?=(%finished -.client-response)
|
||||||
|
?~ full-file.client-response
|
||||||
|
(pure:m ~)
|
||||||
|
=/ body=@t q.data.u.full-file.client-response
|
||||||
|
=/ jon=(unit json) (de-json:html body)
|
||||||
|
?~ jon
|
||||||
|
(pure:m ~)
|
||||||
|
=, dejs-soft:format
|
||||||
|
=/ array=(unit (list response:rpc:jstd))
|
||||||
|
((ar parse-one-response) u.jon)
|
||||||
|
?~ array
|
||||||
|
=/ res=(unit response:rpc:jstd) (parse-one-response u.jon)
|
||||||
|
?~ res
|
||||||
|
(async-fail:stdio %request-rpc-parse-error >id< ~)
|
||||||
|
?: ?=(%error -.u.res)
|
||||||
|
(async-fail:stdio %request-rpc-error >id< >+.res< ~)
|
||||||
|
?. ?=(%result -.u.res)
|
||||||
|
(async-fail:stdio %request-rpc-fail >u.res< ~)
|
||||||
|
(pure:m `res.u.res)
|
||||||
|
(async-fail:stdio %request-rpc-batch >%not-implemented< ~)
|
||||||
|
:: (pure:m `[%batch u.array])
|
||||||
|
::
|
||||||
|
++ parse-one-response
|
||||||
|
|= =json
|
||||||
|
^- (unit response:rpc:jstd)
|
||||||
|
=/ res=(unit [@t ^json])
|
||||||
|
%. json
|
||||||
|
=, dejs-soft:format
|
||||||
|
(ot id+so result+some ~)
|
||||||
|
?^ res `[%result u.res]
|
||||||
|
~| parse-one-response=json
|
||||||
|
:+ ~ %error %- need
|
||||||
|
%. json
|
||||||
|
=, dejs-soft:format
|
||||||
|
(ot id+so error+(ot code+no message+so ~) ~)
|
||||||
|
--
|
||||||
|
--
|
Loading…
Reference in New Issue
Block a user