mirror of
https://github.com/ilyakooo0/urbit.git
synced 2024-12-24 23:44:56 +03:00
various: fix dependencies & tests
This commit is contained in:
parent
5e5e0cb681
commit
143a8e08e6
@ -87,6 +87,7 @@
|
||||
--
|
||||
::
|
||||
|_ =bowl:gall
|
||||
++ bec byk.bowl(r da+now.bowl)
|
||||
::
|
||||
++ poke-spider
|
||||
|= [=path our=@p =cage]
|
||||
|
@ -118,6 +118,7 @@
|
||||
--
|
||||
::
|
||||
|_ =bowl:gall
|
||||
++ bec byk.bowl(r da+now.bowl)
|
||||
++ poke-spider
|
||||
|= [=path our=@p =cage]
|
||||
^- card
|
||||
@ -138,7 +139,7 @@
|
||||
^- (list card)
|
||||
=/ tid=@ta
|
||||
:((cury cat 3) dap.bowl '--' node-id '--' (scot %uv eny.bowl))
|
||||
=/ args [~ `tid bec %eth-send-txs !>([node step txs]]
|
||||
=/ 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))
|
||||
==
|
||||
|
@ -175,6 +175,7 @@
|
||||
--
|
||||
::
|
||||
|_ =bowl:gall
|
||||
++ bec byk.bowl(r da+now.bowl)
|
||||
++ setup-cards
|
||||
^- (list card)
|
||||
:~ wait-export
|
||||
|
@ -547,7 +547,7 @@
|
||||
=+ .^
|
||||
=tube:clay
|
||||
%cc
|
||||
/(scot %p our.bowl)/[q.byk.bowl]/(scot %da now.bowl)/[output]/json
|
||||
/(scot %p our.bowl)/[desk]/(scot %da now.bowl)/[output]/json
|
||||
==
|
||||
:_ state(serving (~(del by serving.state) tid))
|
||||
%+ give-simple-payload:app:server eyre-id
|
||||
|
@ -1,76 +0,0 @@
|
||||
:: Print useful diagnostic information
|
||||
::
|
||||
:: base-hash: loosely, the most recent successfully applied update.
|
||||
:: Technically, the mergebase of %home with OTA source
|
||||
:: sour-hash: most recently downloaded update (not necessarily applied)
|
||||
:: home-hash: hash of %home desk, which may differ if you have changed
|
||||
:: it, for example with notebooks or 3rd party apps
|
||||
:: kids-hash: hash of the %kids desk, which is what you serve to your
|
||||
:: children
|
||||
:: glob-hash: hash of the glob, which is the js for landscape
|
||||
::
|
||||
/- glob
|
||||
/+ version
|
||||
:- %say
|
||||
|= [[now=time * bec=beak] ~ ~]
|
||||
=* our p.bec
|
||||
=/ sponsor (sein:title our now our)
|
||||
:- %noun
|
||||
=<
|
||||
:~
|
||||
[%base-hash (base-hash:version our now)]
|
||||
[%sour-hash sour-hash]
|
||||
[%home-hash .^(@uv %cz (pathify ~.home ~))]
|
||||
[%kids-hash .^(@uv %cz (pathify ~.kids ~))]
|
||||
[%glob-hash glob-state]
|
||||
::
|
||||
(info %our our)
|
||||
(info %sponsor sponsor)
|
||||
(info %dopzod ~dopzod)
|
||||
::
|
||||
["Compare lifes and rifts to values here:"]
|
||||
["https://etherscan.io/address/azimuth.eth#readContract"]
|
||||
[" life - getKeyRevisionNumber"]
|
||||
[" rift - getContinuityNumber"]
|
||||
==
|
||||
|%
|
||||
++ pathify
|
||||
|= [a=@ta b=(unit ship)]
|
||||
^- path
|
||||
=/ o=@ta (scot %p our)
|
||||
=/ n=@ta (scot %da now)
|
||||
?~ b ~[o a n]
|
||||
~[o a n (scot %p u.b)]
|
||||
::
|
||||
++ info
|
||||
|= [=term =ship]
|
||||
:: unitized life and rift
|
||||
=/ lyfe .^((unit @ud) %j (pathify ~.lyfe `ship))
|
||||
=/ ryft .^((unit @ud) %j (pathify ~.ryft `ship))
|
||||
:* term
|
||||
ship=ship
|
||||
point=(crip (slag 2 (scow %ui ship)))
|
||||
:: report as units
|
||||
life=lyfe
|
||||
rift=ryft
|
||||
==
|
||||
::
|
||||
++ sour-hash
|
||||
=+ .^ ota=(unit [=ship =desk =aeon:clay])
|
||||
%gx /(scot %p our)/hood/(scot %da now)/kiln/ota/noun
|
||||
==
|
||||
?~ ota
|
||||
*@uv
|
||||
=/ parent (scot %p ship.u.ota)
|
||||
=+ .^(=cass:clay %cs /[parent]/[desk.u.ota]/1/late/foo)
|
||||
.^(@uv %cz /[parent]/[desk.u.ota]/(scot %ud ud.cass))
|
||||
::
|
||||
++ glob-state
|
||||
^- (list [path @uv @tas])
|
||||
=+ !< [@ud =globs:glob]
|
||||
.^(vase %gx (weld (pathify ~.glob ~) /dbug/state/noun))
|
||||
%+ turn ~(tap by globs)
|
||||
|= [srv=path hash=@uv glob=(unit [? *])]
|
||||
^- [path @uv @tas]
|
||||
[srv hash ?~(glob %waiting ?:(-.u.glob %done %trying))]
|
||||
--
|
@ -1 +0,0 @@
|
||||
../../base-dev/lib/treaty.hoon
|
@ -0,0 +1,13 @@
|
||||
|_ =desk
|
||||
++ grad %noun
|
||||
++ grow
|
||||
|%
|
||||
++ noun desk
|
||||
++ json s+desk
|
||||
--
|
||||
++ grab
|
||||
|%
|
||||
++ noun ^desk
|
||||
++ json so:dejs:format
|
||||
--
|
||||
--
|
@ -85,7 +85,6 @@
|
||||
|.
|
||||
=/ ford
|
||||
%: ford:fusion
|
||||
bud
|
||||
*ankh:clay
|
||||
deletes=~
|
||||
changes=(my [/lib/self/hoon &+hoon+source]~)
|
||||
@ -101,7 +100,6 @@
|
||||
++ test-mar-mime ^- tang
|
||||
=/ ford
|
||||
%: ford:fusion
|
||||
bud
|
||||
*ankh:clay
|
||||
deletes=~
|
||||
changes=(my [/mar/mime/hoon &+hoon+mar-mime]~)
|
||||
@ -122,7 +120,6 @@
|
||||
++ test-mar-udon ^- tang
|
||||
=/ ford
|
||||
%: ford:fusion
|
||||
bud
|
||||
*ankh:clay
|
||||
deletes=~
|
||||
^= changes
|
||||
@ -154,7 +151,6 @@
|
||||
==
|
||||
=/ ford
|
||||
%: ford:fusion
|
||||
bud
|
||||
*ankh:clay
|
||||
deletes=~
|
||||
changes
|
||||
@ -174,7 +170,6 @@
|
||||
==
|
||||
=/ ford
|
||||
%: ford:fusion
|
||||
bud
|
||||
*ankh:clay
|
||||
deletes=~
|
||||
changes
|
||||
@ -195,7 +190,6 @@
|
||||
==
|
||||
=/ ford
|
||||
%: ford:fusion
|
||||
bud
|
||||
*ankh:clay
|
||||
deletes=~
|
||||
changes
|
||||
@ -210,7 +204,6 @@
|
||||
++ test-gen-hello ^- tang
|
||||
=/ ford
|
||||
%: ford:fusion
|
||||
bud
|
||||
*ankh:clay
|
||||
deletes=~
|
||||
changes=(my [/gen/hello/hoon &+hoon+gen-hello]~)
|
||||
@ -231,7 +224,6 @@
|
||||
++ test-lib-strandio ^- tang
|
||||
=/ ford
|
||||
%: ford:fusion
|
||||
bud
|
||||
*ankh:clay
|
||||
deletes=~
|
||||
^= changes
|
||||
|
@ -2346,6 +2346,7 @@
|
||||
++ scry-provides-code ^- roof
|
||||
|= [gang =view =beam]
|
||||
^- (unit (unit cage))
|
||||
?: =(%gd view) ``noun+!>(%base)
|
||||
?: &(=(%ca view) =(/gen/handler/hoon s.beam))
|
||||
:+ ~ ~
|
||||
vase+!>(!>(|=(* |=(* [[%404 ~] ~]))))
|
||||
|
@ -33,13 +33,13 @@
|
||||
=/ ship ~nec
|
||||
::
|
||||
=/ call-args
|
||||
=/ =task:gall [%jolt dap %home]
|
||||
=/ =task:gall [%jolt %base dap]
|
||||
[duct task]
|
||||
::
|
||||
=/ =move:gall-gate
|
||||
=/ =wire /sys/cor/[dap]/(scot %p ship)/home/(scot %da time)
|
||||
=/ =wire /sys/cor/[dap]/(scot %p ship)/base/(scot %da time)
|
||||
=/ =note-arvo
|
||||
[%c %warp ship %home ~ %sing %a da+time /app/[dap]/hoon]
|
||||
[%c %warp ship %base ~ %sing %a da+time /app/[dap]/hoon]
|
||||
[duct %pass wire note-arvo]
|
||||
::
|
||||
=/ expected-moves=(list move:gall-gate) ~[move]
|
||||
|
@ -1,81 +0,0 @@
|
||||
/- *treaty
|
||||
/+ dock=docket
|
||||
|%
|
||||
++ enjs
|
||||
=, enjs:format
|
||||
|%
|
||||
++ merge
|
||||
|= [a=json b=json]
|
||||
^- json
|
||||
?> &(?=(%o -.a) ?=(%o -.b))
|
||||
[%o (~(uni by p.a) p.b)]
|
||||
::
|
||||
++ treaty
|
||||
|= t=^treaty
|
||||
%+ merge (docket:enjs:dock docket.t)
|
||||
%- pairs
|
||||
:~ ship+s+(scot %p ship.t)
|
||||
desk+s+desk.t
|
||||
cass+(case case.t)
|
||||
hash+s+(scot %uv hash.t)
|
||||
==
|
||||
::
|
||||
++ case
|
||||
|= c=^case
|
||||
%+ frond -.c
|
||||
?- -.c
|
||||
%da s+(scot %da p.c)
|
||||
%tas s+(scot %tas p.c)
|
||||
%ud (numb p.c)
|
||||
==
|
||||
++ foreign-desk
|
||||
|= [s=^ship =desk]
|
||||
^- cord
|
||||
(crip "{(scow %p s)}/{(trip desk)}")
|
||||
::
|
||||
++ alliance
|
||||
|= a=^alliance
|
||||
^- json
|
||||
:- %a
|
||||
%+ turn ~(tap in a)
|
||||
|= [=^ship =desk]
|
||||
^- json
|
||||
s+(foreign-desk ship desk)
|
||||
::
|
||||
++ treaty-update
|
||||
|= u=update:^treaty
|
||||
^- json
|
||||
%+ frond -.u
|
||||
?- -.u
|
||||
%add (treaty treaty.u)
|
||||
%del s+(foreign-desk +.u)
|
||||
::
|
||||
%ini
|
||||
%- pairs
|
||||
%+ turn ~(tap by init.u)
|
||||
|= [[s=^ship =desk] t=^treaty]
|
||||
[(foreign-desk s desk) (treaty t)]
|
||||
==
|
||||
::
|
||||
++ ally-update
|
||||
|= u=update:ally
|
||||
^- json
|
||||
%+ frond -.u
|
||||
?- -.u
|
||||
?(%add %del) s+(scot %p ship.u)
|
||||
::
|
||||
%ini
|
||||
%- pairs
|
||||
%+ turn ~(tap by init.u)
|
||||
|= [s=^ship a=^alliance]
|
||||
[(scot %p s) (alliance a)]
|
||||
::
|
||||
%new
|
||||
%- pairs
|
||||
:~ ship+s+(scot %p ship.u)
|
||||
alliance+(alliance alliance.u)
|
||||
==
|
||||
==
|
||||
--
|
||||
--
|
||||
|
@ -1 +0,0 @@
|
||||
../../base-dev/lib/treaty.hoon
|
@ -83,7 +83,6 @@
|
||||
pass pass:io
|
||||
::
|
||||
++ on-init
|
||||
=. current-timebox now.bowl
|
||||
`this
|
||||
::
|
||||
++ on-save !>(-.state)
|
||||
|
@ -1,7 +1,7 @@
|
||||
:~ title+'Garden'
|
||||
info+'An app launcher for Urbit.'
|
||||
color+0xee.5432
|
||||
glob-http+'https://bootstrap.urbit.org/glob-0v2.dne76.9hibl.1o442.h6l11.cn7os.glob'
|
||||
glob-http+'https://bootstrap.urbit.org/glob-0vk49j3.ne5gf.5viv2.ghlb4.r6b8n.glob'
|
||||
::glob-ames+~zod
|
||||
base+'grid'
|
||||
version+[0 0 1]
|
||||
|
@ -1 +0,0 @@
|
||||
../../base-dev/lib/treaty.hoon
|
81
pkg/garden/lib/treaty.hoon
Normal file
81
pkg/garden/lib/treaty.hoon
Normal file
@ -0,0 +1,81 @@
|
||||
/- *treaty
|
||||
/+ dock=docket
|
||||
|%
|
||||
++ enjs
|
||||
=, enjs:format
|
||||
|%
|
||||
++ merge
|
||||
|= [a=json b=json]
|
||||
^- json
|
||||
?> &(?=(%o -.a) ?=(%o -.b))
|
||||
[%o (~(uni by p.a) p.b)]
|
||||
::
|
||||
++ treaty
|
||||
|= t=^treaty
|
||||
%+ merge (docket:enjs:dock docket.t)
|
||||
%- pairs
|
||||
:~ ship+s+(scot %p ship.t)
|
||||
desk+s+desk.t
|
||||
cass+(case case.t)
|
||||
hash+s+(scot %uv hash.t)
|
||||
==
|
||||
::
|
||||
++ case
|
||||
|= c=^case
|
||||
%+ frond -.c
|
||||
?- -.c
|
||||
%da s+(scot %da p.c)
|
||||
%tas s+(scot %tas p.c)
|
||||
%ud (numb p.c)
|
||||
==
|
||||
++ foreign-desk
|
||||
|= [s=^ship =desk]
|
||||
^- cord
|
||||
(crip "{(scow %p s)}/{(trip desk)}")
|
||||
::
|
||||
++ alliance
|
||||
|= a=^alliance
|
||||
^- json
|
||||
:- %a
|
||||
%+ turn ~(tap in a)
|
||||
|= [=^ship =desk]
|
||||
^- json
|
||||
s+(foreign-desk ship desk)
|
||||
::
|
||||
++ treaty-update
|
||||
|= u=update:^treaty
|
||||
^- json
|
||||
%+ frond -.u
|
||||
?- -.u
|
||||
%add (treaty treaty.u)
|
||||
%del s+(foreign-desk +.u)
|
||||
::
|
||||
%ini
|
||||
%- pairs
|
||||
%+ turn ~(tap by init.u)
|
||||
|= [[s=^ship =desk] t=^treaty]
|
||||
[(foreign-desk s desk) (treaty t)]
|
||||
==
|
||||
::
|
||||
++ ally-update
|
||||
|= u=update:ally
|
||||
^- json
|
||||
%+ frond -.u
|
||||
?- -.u
|
||||
?(%add %del) s+(scot %p ship.u)
|
||||
::
|
||||
%ini
|
||||
%- pairs
|
||||
%+ turn ~(tap by init.u)
|
||||
|= [s=^ship a=^alliance]
|
||||
[(scot %p s) (alliance a)]
|
||||
::
|
||||
%new
|
||||
%- pairs
|
||||
:~ ship+s+(scot %p ship.u)
|
||||
alliance+(alliance alliance.u)
|
||||
==
|
||||
==
|
||||
--
|
||||
--
|
||||
|
@ -1,5 +1,5 @@
|
||||
/+ dock=docket
|
||||
|_ treaties=(list treaty:dock)
|
||||
/+ treaty
|
||||
|_ treaties=(list treaty:treaty)
|
||||
++ grow
|
||||
|%
|
||||
++ noun treaties
|
||||
@ -7,14 +7,14 @@
|
||||
^- ^json
|
||||
%- pairs:enjs:format
|
||||
%+ turn treaties
|
||||
|= =treaty:dock
|
||||
:- (crip "{(scow %p ship.treaty)}/{(trip desk.treaty)}")
|
||||
(treaty:enjs:dock treaty)
|
||||
|= t=treaty:treaty
|
||||
:- (crip "{(scow %p ship.t)}/{(trip desk.t)}")
|
||||
(treaty:enjs:treaty t)
|
||||
|
||||
--
|
||||
++ grab
|
||||
|%
|
||||
++ noun (list treaty:dock)
|
||||
++ noun (list treaty:treaty)
|
||||
--
|
||||
++ grad %noun
|
||||
--
|
||||
|
@ -10,7 +10,6 @@ import Notifications from '~/views/apps/notifications/notifications';
|
||||
import { PermalinkRoutes } from '~/views/apps/permalinks/app';
|
||||
import Profile from '~/views/apps/profile/profile';
|
||||
import Settings from '~/views/apps/settings/settings';
|
||||
import TermApp from '~/views/apps/term/app';
|
||||
import ErrorComponent from '~/views/components/Error';
|
||||
import { useShortcut } from '~/logic/state/settings';
|
||||
|
||||
@ -97,7 +96,6 @@ function getNotificationRedirect(link: string) {
|
||||
} else if (link.startsWith('/invite')) {
|
||||
return getInviteRedirect(link);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export const Content = (props) => {
|
||||
@ -154,16 +152,6 @@ export const Content = (props) => {
|
||||
/>
|
||||
)}
|
||||
/>
|
||||
<Route
|
||||
path='/~term'
|
||||
render={p => (
|
||||
<TermApp
|
||||
location={p.location}
|
||||
match={p.match}
|
||||
{...props}
|
||||
/>
|
||||
)}
|
||||
/>
|
||||
<Route path='/~landscape'>
|
||||
<Landscape />
|
||||
</Route>
|
||||
|
@ -6,7 +6,6 @@
|
||||
%group-store
|
||||
%invite-store
|
||||
%s3-store
|
||||
%settings-store
|
||||
%chat-cli
|
||||
%chat-hook
|
||||
%chat-view
|
||||
|
@ -1,7 +1,7 @@
|
||||
:~ title+'Landscape'
|
||||
info+'A suite of applications to communicate on Urbit'
|
||||
color+0xee.5432
|
||||
glob-http+'https://bootstrap.urbit.org/glob-0v7.bcnlj.eocmq.cmbeu.b8s54.8se40.glob'
|
||||
glob-http+'https://bootstrap.urbit.org/glob-0v4.oicrf.rs88p.9jra8.e186l.losvv.glob'
|
||||
base+'landscape'
|
||||
version+[1 3 5]
|
||||
website+'https://tlon.io'
|
||||
|
@ -1,866 +0,0 @@
|
||||
:: ethereum: utilities
|
||||
::
|
||||
=, ethereum-types
|
||||
|%
|
||||
:: deriving and using ethereum keys
|
||||
::
|
||||
++ key
|
||||
|%
|
||||
++ address-from-pub
|
||||
=, keccak:crypto
|
||||
|= pub=@
|
||||
%+ end [3 20]
|
||||
%+ keccak-256 64
|
||||
(rev 3 64 pub)
|
||||
::
|
||||
++ address-from-prv
|
||||
(cork pub-from-prv address-from-pub)
|
||||
::
|
||||
++ pub-from-prv
|
||||
=, secp256k1:secp:crypto
|
||||
|= prv=@
|
||||
%- serialize-point
|
||||
(priv-to-pub prv)
|
||||
::
|
||||
++ sign-transaction
|
||||
=, crypto
|
||||
|= [tx=transaction:rpc pk=@]
|
||||
^- @ux
|
||||
:: hash the raw transaction data
|
||||
=/ hash=@
|
||||
=/ dat=@
|
||||
%- encode-atoms:rlp
|
||||
:: with v=chain-id, r=0, s=0
|
||||
tx(chain-id [chain-id.tx 0 0 ~])
|
||||
=+ wid=(met 3 dat)
|
||||
%- keccak-256:keccak
|
||||
[wid (rev 3 wid dat)]
|
||||
:: sign transaction hash with private key
|
||||
=+ (ecdsa-raw-sign:secp256k1:secp hash pk)
|
||||
:: complete transaction is raw data, with r and s
|
||||
:: taken from the signature, and v as per eip-155
|
||||
%- encode-atoms:rlp
|
||||
tx(chain-id [:(add (mul chain-id.tx 2) 35 v) r s ~])
|
||||
--
|
||||
::
|
||||
:: rlp en/decoding
|
||||
::NOTE https://github.com/ethereum/wiki/wiki/RLP
|
||||
::
|
||||
++ rlp
|
||||
|%
|
||||
::NOTE rlp encoding doesn't really care about leading zeroes,
|
||||
:: but because we need to disinguish between no-bytes zero
|
||||
:: and one-byte zero (and also empty list) we end up with
|
||||
:: this awful type...
|
||||
+$ item
|
||||
$% [%l l=(list item)]
|
||||
[%b b=byts]
|
||||
==
|
||||
:: +encode-atoms: encode list of atoms as a %l of %b items
|
||||
::
|
||||
++ encode-atoms
|
||||
|= l=(list @)
|
||||
^- @
|
||||
%+ encode %l
|
||||
%+ turn l
|
||||
|=(a=@ b+[(met 3 a) a])
|
||||
::
|
||||
++ encode
|
||||
|= in=item
|
||||
|^ ^- @
|
||||
?- -.in
|
||||
%b
|
||||
?: &(=(1 wid.b.in) (lte dat.b.in 0x7f))
|
||||
dat.b.in
|
||||
=- (can 3 ~[b.in [(met 3 -) -]])
|
||||
(encode-length wid.b.in 0x80)
|
||||
::
|
||||
%l
|
||||
=/ out=@
|
||||
%+ roll l.in
|
||||
|= [ni=item en=@]
|
||||
(cat 3 (encode ni) en)
|
||||
%^ cat 3 out
|
||||
(encode-length (met 3 out) 0xc0)
|
||||
==
|
||||
::
|
||||
++ encode-length
|
||||
|= [len=@ off=@]
|
||||
?: (lth len 56) (add len off)
|
||||
=- (cat 3 len -)
|
||||
:(add (met 3 len) off 55)
|
||||
--
|
||||
:: +decode-atoms: decode expecting a %l of %b items, producing atoms within
|
||||
::
|
||||
++ decode-atoms
|
||||
|= dat=@
|
||||
^- (list @)
|
||||
=/ i=item (decode dat)
|
||||
~| [%unexpected-data i]
|
||||
?> ?=(%l -.i)
|
||||
%+ turn l.i
|
||||
|= i=item
|
||||
~| [%unexpected-list i]
|
||||
?> ?=(%b -.i)
|
||||
dat.b.i
|
||||
::
|
||||
++ decode
|
||||
|= dat=@
|
||||
^- item
|
||||
=/ bytes=(list @) (flop (rip 3 dat))
|
||||
=? bytes ?=(~ bytes) ~[0]
|
||||
|^ item:decode-head
|
||||
::
|
||||
++ decode-head
|
||||
^- [done=@ud =item]
|
||||
?~ bytes
|
||||
~| %rlp-unexpected-end
|
||||
!!
|
||||
=* byt i.bytes
|
||||
:: byte in 0x00-0x79 range encodes itself
|
||||
::
|
||||
?: (lte byt 0x79)
|
||||
:- 1
|
||||
[%b 1^byt]
|
||||
:: byte in 0x80-0xb7 range encodes string length
|
||||
::
|
||||
?: (lte byt 0xb7)
|
||||
=+ len=(sub byt 0x80)
|
||||
:- +(len)
|
||||
:- %b
|
||||
len^(get-value 1 len)
|
||||
:: byte in 0xb8-0xbf range encodes string length length
|
||||
::
|
||||
?: (lte byt 0xbf)
|
||||
=+ led=(sub byt 0xb7)
|
||||
=+ len=(get-value 1 led)
|
||||
:- (add +(led) len)
|
||||
:- %b
|
||||
len^(get-value +(led) len)
|
||||
:: byte in 0xc0-f7 range encodes list length
|
||||
::
|
||||
?: (lte byt 0xf7)
|
||||
=+ len=(sub byt 0xc0)
|
||||
:- +(len)
|
||||
:- %l
|
||||
%. len
|
||||
decode-list(bytes (slag 1 `(list @)`bytes))
|
||||
:: byte in 0xf8-ff range encodes list length length
|
||||
::
|
||||
?: (lte byt 0xff)
|
||||
=+ led=(sub byt 0xf7)
|
||||
=+ len=(get-value 1 led)
|
||||
:- (add +(led) len)
|
||||
:- %l
|
||||
%. len
|
||||
decode-list(bytes (slag +(led) `(list @)`bytes))
|
||||
~| [%rip-not-bloq-3 `@ux`byt]
|
||||
!!
|
||||
::
|
||||
++ decode-list
|
||||
|= rem=@ud
|
||||
^- (list item)
|
||||
?: =(0 rem) ~
|
||||
=+ ^- [don=@ud =item] ::TODO =/
|
||||
decode-head
|
||||
:- item
|
||||
%= $
|
||||
rem (sub rem don)
|
||||
bytes (slag don bytes)
|
||||
==
|
||||
::
|
||||
++ get-value
|
||||
|= [at=@ud to=@ud]
|
||||
^- @
|
||||
(rep 3 (flop (swag [at to] bytes)))
|
||||
--
|
||||
--
|
||||
::
|
||||
:: abi en/decoding
|
||||
::NOTE https://solidity.readthedocs.io/en/develop/abi-spec.html
|
||||
::
|
||||
++ abi
|
||||
=> |%
|
||||
:: solidity types. integer bitsizes ignored
|
||||
++ etyp
|
||||
$@ $? :: static
|
||||
%address %bool
|
||||
%int %uint
|
||||
%real %ureal
|
||||
:: dynamic
|
||||
%bytes %string
|
||||
==
|
||||
$% :: static
|
||||
[%bytes-n n=@ud]
|
||||
:: dynamic
|
||||
[%array-n t=etyp n=@ud]
|
||||
[%array t=etyp]
|
||||
==
|
||||
::
|
||||
:: solidity-style typed data. integer bitsizes ignored
|
||||
++ data
|
||||
$% [%address p=address]
|
||||
[%string p=tape]
|
||||
[%bool p=?]
|
||||
[%int p=@sd]
|
||||
[%uint p=@ud]
|
||||
[%real p=@rs]
|
||||
[%ureal p=@urs]
|
||||
[%array-n p=(list data)]
|
||||
[%array p=(list data)]
|
||||
[%bytes-n p=octs] ::TODO just @, because context knows length?
|
||||
[%bytes p=octs]
|
||||
==
|
||||
--
|
||||
=, mimes:html
|
||||
|%
|
||||
:: encoding
|
||||
::
|
||||
++ encode-args
|
||||
:: encode list of arguments.
|
||||
::
|
||||
|= das=(list data)
|
||||
^- tape
|
||||
(encode-data [%array-n das])
|
||||
::
|
||||
++ encode-data
|
||||
:: encode typed data into ABI bytestring.
|
||||
::
|
||||
|= dat=data
|
||||
^- tape
|
||||
?+ -.dat
|
||||
~| [%unsupported-type -.dat]
|
||||
!!
|
||||
::
|
||||
%array-n
|
||||
:: enc(X) = head(X[0]) ... head(X[k-1]) tail(X[0]) ... tail(X[k-1])
|
||||
:: where head and tail are defined for X[i] being of a static type as
|
||||
:: head(X[i]) = enc(X[i]) and tail(X[i]) = "" (the empty string), or as
|
||||
:: head(X[i]) = enc(len( head(X[0])..head(X[k-1])
|
||||
:: tail(X[0])..tail(X[i-1]) ))
|
||||
:: and tail(X[i]) = enc(X[i]) otherwise.
|
||||
::
|
||||
:: so: if it's a static type, data goes in the head. if it's a dynamic
|
||||
:: type, a reference goes into the head and data goes into the tail.
|
||||
::
|
||||
:: in the head, we first put a placeholder where references need to go.
|
||||
=+ hol=(reap 64 'x')
|
||||
=/ hes=(list tape)
|
||||
%+ turn p.dat
|
||||
|= d=data
|
||||
?. (is-dynamic-type d) ^$(dat d)
|
||||
hol
|
||||
=/ tas=(list tape)
|
||||
%+ turn p.dat
|
||||
|= d=data
|
||||
?. (is-dynamic-type d) ""
|
||||
^$(dat d)
|
||||
:: once we know the head and tail, we can fill in the references in head.
|
||||
=- (weld nes `tape`(zing tas))
|
||||
^- [@ud nes=tape]
|
||||
=+ led=(lent (zing hes))
|
||||
%+ roll hes
|
||||
|= [t=tape i=@ud nes=tape]
|
||||
:- +(i)
|
||||
:: if no reference needed, just put the data.
|
||||
?. =(t hol) (weld nes t)
|
||||
:: calculate byte offset of data we need to reference.
|
||||
=/ ofs=@ud
|
||||
=- (div - 2) :: two hex digits per byte.
|
||||
%+ add led :: count head, and
|
||||
%- lent %- zing :: count all tail data
|
||||
(scag i tas) :: preceding ours.
|
||||
=+ ref=^$(dat [%uint ofs])
|
||||
:: shouldn't hit this unless we're sending over 2gb of data?
|
||||
~| [%weird-ref-lent (lent ref)]
|
||||
?> =((lent ref) (lent hol))
|
||||
(weld nes ref)
|
||||
::
|
||||
%array :: where X has k elements (k is assumed to be of type uint256):
|
||||
:: enc(X) = enc(k) enc([X[1], ..., X[k]])
|
||||
:: i.e. it is encoded as if it were an array of static size k, prefixed
|
||||
:: with the number of elements.
|
||||
%+ weld $(dat [%uint (lent p.dat)])
|
||||
$(dat [%array-n p.dat])
|
||||
::
|
||||
%bytes-n
|
||||
:: enc(X) is the sequence of bytes in X padded with zero-bytes to a
|
||||
:: length of 32.
|
||||
:: Note that for any X, len(enc(X)) is a multiple of 32.
|
||||
~| [%bytes-n-too-long max=32 actual=p.p.dat]
|
||||
?> (lte p.p.dat 32)
|
||||
(pad-to-multiple (render-hex-bytes p.dat) 64 %right)
|
||||
::
|
||||
%bytes :: of length k (which is assumed to be of type uint256)
|
||||
:: enc(X) = enc(k) pad_right(X), i.e. the number of bytes is encoded as a
|
||||
:: uint256 followed by the actual value of X as a byte sequence, followed
|
||||
:: by the minimum number of zero-bytes such that len(enc(X)) is a
|
||||
:: multiple of 32.
|
||||
%+ weld $(dat [%uint p.p.dat])
|
||||
(pad-to-multiple (render-hex-bytes p.dat) 64 %right)
|
||||
::
|
||||
%string
|
||||
:: enc(X) = enc(enc_utf8(X)), i.e. X is utf-8 encoded and this value is
|
||||
:: interpreted as of bytes type and encoded further. Note that the length
|
||||
:: used in this subsequent encoding is the number of bytes of the utf-8
|
||||
:: encoded string, not its number of characters.
|
||||
$(dat [%bytes (lent p.dat) (swp 3 (crip p.dat))])
|
||||
::
|
||||
%uint
|
||||
:: enc(X) is the big-endian encoding of X, padded on the higher-order
|
||||
:: (left) side with zero-bytes such that the length is a multiple of 32
|
||||
:: bytes.
|
||||
(pad-to-multiple (render-hex-bytes (as-octs p.dat)) 64 %left)
|
||||
::
|
||||
%bool
|
||||
:: as in the uint8 case, where 1 is used for true and 0 for false
|
||||
$(dat [%uint ?:(p.dat 1 0)])
|
||||
::
|
||||
%address
|
||||
:: as in the uint160 case
|
||||
$(dat [%uint `@ud`p.dat])
|
||||
==
|
||||
::
|
||||
++ is-dynamic-type
|
||||
|= a=data
|
||||
?. ?=(%array-n -.a)
|
||||
?=(?(%string %bytes %array) -.a)
|
||||
&(!=((lent p.a) 0) (lien p.a is-dynamic-type))
|
||||
::
|
||||
:: decoding
|
||||
::
|
||||
++ decode-topics decode-arguments
|
||||
::
|
||||
++ decode-results
|
||||
:: rex: string of hex bytes with leading 0x.
|
||||
|* [rex=@t tys=(list etyp)]
|
||||
=- (decode-arguments - tys)
|
||||
%^ rut 9
|
||||
(rsh [3 2] rex)
|
||||
(curr rash hex)
|
||||
::
|
||||
++ decode-arguments
|
||||
|* [wos=(list @) tys=(list etyp)]
|
||||
=/ wos=(list @) wos :: get rid of tmi
|
||||
=| win=@ud
|
||||
=< (decode-from 0 tys)
|
||||
|%
|
||||
++ decode-from
|
||||
|* [win=@ud tys=(list etyp)]
|
||||
?~ tys !!
|
||||
=- ?~ t.tys dat
|
||||
[dat $(win nin, tys t.tys)]
|
||||
(decode-one win ~[i.tys])
|
||||
::
|
||||
++ decode-one
|
||||
::NOTE we take (list etyp) even though we only operate on
|
||||
:: a single etyp as a workaround for urbit/arvo#673
|
||||
|* [win=@ud tys=(list etyp)]
|
||||
=- [nin dat]=- ::NOTE ^= regular form broken
|
||||
?~ tys !!
|
||||
=* typ i.tys
|
||||
=+ wor=(snag win wos)
|
||||
?+ typ
|
||||
~| [%unsupported-type typ]
|
||||
!!
|
||||
::
|
||||
?(%address %bool %uint) :: %int %real %ureal
|
||||
:- +(win)
|
||||
?- typ
|
||||
%address `@ux`wor
|
||||
%uint `@ud`wor
|
||||
%bool =(1 wor)
|
||||
==
|
||||
::
|
||||
%string
|
||||
=+ $(tys ~[%bytes])
|
||||
[nin (trip (swp 3 q.dat))]
|
||||
::
|
||||
%bytes
|
||||
:- +(win)
|
||||
:: find the word index of the actual data.
|
||||
=/ lic=@ud (div wor 32)
|
||||
:: learn the bytelength of the data.
|
||||
=/ len=@ud (snag lic wos)
|
||||
(decode-bytes-n +(lic) len)
|
||||
::
|
||||
[%bytes-n *]
|
||||
:- (add win +((div (dec n.typ) 32)))
|
||||
(decode-bytes-n win n.typ)
|
||||
::
|
||||
[%array *]
|
||||
:- +(win)
|
||||
:: find the word index of the actual data.
|
||||
=. win (div wor 32)
|
||||
:: read the elements from their location.
|
||||
%- tail
|
||||
%^ decode-array-n ~[t.typ] +(win)
|
||||
(snag win wos)
|
||||
::
|
||||
[%array-n *]
|
||||
(decode-array-n ~[t.typ] win n.typ)
|
||||
==
|
||||
::
|
||||
++ decode-bytes-n
|
||||
|= [fro=@ud bys=@ud]
|
||||
^- octs
|
||||
:: parse {bys} bytes from {fro}.
|
||||
:- bys
|
||||
%+ rsh
|
||||
:- 3
|
||||
=+ (mod bys 32)
|
||||
?:(=(0 -) - (sub 32 -))
|
||||
%+ rep 8
|
||||
%- flop
|
||||
=- (swag [fro -] wos)
|
||||
+((div (dec bys) 32))
|
||||
::
|
||||
++ decode-array-n
|
||||
::NOTE we take (list etyp) even though we only operate on
|
||||
:: a single etyp as a workaround for urbit/arvo#673
|
||||
::NOTE careful! produces lists without type info
|
||||
=| res=(list)
|
||||
|* [tys=(list etyp) fro=@ud len=@ud]
|
||||
^- [@ud (list)]
|
||||
?~ tys !!
|
||||
?: =(len 0) [fro (flop `(list)`res)]
|
||||
=+ (decode-one fro ~[i.tys]) :: [nin=@ud dat=*]
|
||||
$(res ^+(res [dat res]), fro nin, len (dec len))
|
||||
--
|
||||
--
|
||||
::
|
||||
:: communicating with rpc nodes
|
||||
::NOTE https://github.com/ethereum/wiki/wiki/JSON-RPC
|
||||
::
|
||||
++ rpc
|
||||
:: types
|
||||
::
|
||||
=> =, abi
|
||||
=, format
|
||||
|%
|
||||
:: raw call data
|
||||
++ call-data
|
||||
$: function=@t
|
||||
arguments=(list data)
|
||||
==
|
||||
::
|
||||
:: raw transaction data
|
||||
+$ transaction
|
||||
$: nonce=@ud
|
||||
gas-price=@ud
|
||||
gas=@ud
|
||||
to=address
|
||||
value=@ud
|
||||
data=@ux
|
||||
chain-id=@ux
|
||||
==
|
||||
::
|
||||
:: ethereum json rpc api
|
||||
::
|
||||
:: supported requests.
|
||||
++ request
|
||||
$% [%eth-block-number ~]
|
||||
[%eth-call cal=call deb=block]
|
||||
$: %eth-new-filter
|
||||
fro=(unit block)
|
||||
tob=(unit block)
|
||||
adr=(list address)
|
||||
top=(list ?(@ux (list @ux)))
|
||||
==
|
||||
[%eth-get-block-by-number bon=@ud txs=?]
|
||||
[%eth-get-filter-logs fid=@ud]
|
||||
$: %eth-get-logs
|
||||
fro=(unit block)
|
||||
tob=(unit block)
|
||||
adr=(list address)
|
||||
top=(list ?(@ux (list @ux)))
|
||||
==
|
||||
$: %eth-get-logs-by-hash
|
||||
has=@
|
||||
adr=(list address)
|
||||
top=(list ?(@ux (list @ux)))
|
||||
==
|
||||
[%eth-get-filter-changes fid=@ud]
|
||||
[%eth-get-transaction-count adr=address =block]
|
||||
[%eth-get-transaction-receipt txh=@ux]
|
||||
[%eth-send-raw-transaction dat=@ux]
|
||||
==
|
||||
::
|
||||
::TODO clean up & actually use
|
||||
++ response
|
||||
$% ::TODO
|
||||
[%eth-new-filter fid=@ud]
|
||||
[%eth-get-filter-logs los=(list event-log)]
|
||||
[%eth-get-logs los=(list event-log)]
|
||||
[%eth-get-logs-by-hash los=(list event-log)]
|
||||
[%eth-got-filter-changes los=(list event-log)]
|
||||
[%eth-transaction-hash haz=@ux]
|
||||
==
|
||||
::
|
||||
++ event-log
|
||||
$: :: null for pending logs
|
||||
$= mined %- unit
|
||||
$: log-index=@ud
|
||||
transaction-index=@ud
|
||||
transaction-hash=@ux
|
||||
block-number=@ud
|
||||
block-hash=@ux
|
||||
removed=?
|
||||
==
|
||||
::
|
||||
address=@ux
|
||||
data=@t
|
||||
:: event data
|
||||
::
|
||||
:: For standard events, the first topic is the event signature
|
||||
:: hash. For anonymous events, the first topic is the first
|
||||
:: indexed argument.
|
||||
:: Note that this does not support the "anonymous event with
|
||||
:: zero topics" case. This has dubious usability, and using
|
||||
:: +lest instead of +list saves a lot of ?~ checks.
|
||||
::
|
||||
topics=(lest @ux)
|
||||
==
|
||||
::
|
||||
:: data for eth_call.
|
||||
++ call
|
||||
$: from=(unit address)
|
||||
to=address
|
||||
gas=(unit @ud)
|
||||
gas-price=(unit @ud)
|
||||
value=(unit @ud)
|
||||
data=tape
|
||||
==
|
||||
::
|
||||
:: minimum data needed to construct a read call
|
||||
++ proto-read-request
|
||||
$: id=(unit @t)
|
||||
to=address
|
||||
call-data
|
||||
==
|
||||
::
|
||||
:: block to operate on.
|
||||
++ block
|
||||
$% [%number n=@ud]
|
||||
[%label l=?(%earliest %latest %pending)]
|
||||
==
|
||||
--
|
||||
::
|
||||
:: logic
|
||||
::
|
||||
|%
|
||||
++ encode-call
|
||||
|= call-data
|
||||
^- tape
|
||||
::TODO should this check to see if the data matches the function signature?
|
||||
=- :(weld "0x" - (encode-args arguments))
|
||||
%+ scag 8
|
||||
%+ render-hex-bytes 32
|
||||
%- keccak-256:keccak:crypto
|
||||
(as-octs:mimes:html function)
|
||||
::
|
||||
:: building requests
|
||||
::
|
||||
++ json-request
|
||||
=, eyre
|
||||
|= [url=purl jon=json]
|
||||
^- hiss
|
||||
:^ url %post
|
||||
%- ~(gas in *math)
|
||||
~['Content-Type'^['application/json']~]
|
||||
(some (as-octt (en-json:html jon)))
|
||||
:: +light-json-request: like json-request, but for %l
|
||||
::
|
||||
:: TODO: Exorcising +purl from our system is a much longer term effort;
|
||||
:: get the current output types for now.
|
||||
::
|
||||
++ light-json-request
|
||||
|= [url=purl:eyre jon=json]
|
||||
^- request:http
|
||||
::
|
||||
:* %'POST'
|
||||
(crip (en-purl:html url))
|
||||
~[['content-type' 'application/json']]
|
||||
(some (as-octt (en-json:html jon)))
|
||||
==
|
||||
::
|
||||
++ batch-read-request
|
||||
|= req=(list proto-read-request)
|
||||
^- json
|
||||
a+(turn req read-request)
|
||||
::
|
||||
++ read-request
|
||||
|= proto-read-request
|
||||
^- json
|
||||
%+ request-to-json id
|
||||
:+ %eth-call
|
||||
^- call
|
||||
[~ to ~ ~ ~ `tape`(encode-call function arguments)]
|
||||
[%label %latest]
|
||||
::
|
||||
++ request-to-json
|
||||
=, enjs:format
|
||||
|= [riq=(unit @t) req=request]
|
||||
^- json
|
||||
%- pairs
|
||||
=; r=[met=@t pas=(list json)]
|
||||
::TODO should use request-to-json:rpc:jstd,
|
||||
:: and probably (fall riq -.req)
|
||||
:* jsonrpc+s+'2.0'
|
||||
method+s+met.r
|
||||
params+a+pas.r
|
||||
::TODO would just jamming the req noun for id be a bad idea?
|
||||
?~ riq ~
|
||||
[id+s+u.riq]~
|
||||
==
|
||||
?- -.req
|
||||
%eth-block-number
|
||||
['eth_blockNumber' ~]
|
||||
::
|
||||
%eth-call
|
||||
:- 'eth_call'
|
||||
:~ (eth-call-to-json cal.req)
|
||||
(block-to-json deb.req)
|
||||
==
|
||||
::
|
||||
%eth-new-filter
|
||||
:- 'eth_newFilter'
|
||||
:_ ~
|
||||
:- %o %- ~(gas by *(map @t json))
|
||||
=- (murn - same)
|
||||
^- (list (unit (pair @t json)))
|
||||
:~ ?~ fro.req ~
|
||||
`['fromBlock' (block-to-json u.fro.req)]
|
||||
::
|
||||
?~ tob.req ~
|
||||
`['toBlock' (block-to-json u.tob.req)]
|
||||
::
|
||||
::TODO fucking tmi
|
||||
?: =(0 (lent adr.req)) ~
|
||||
:+ ~ 'address'
|
||||
?: =(1 (lent adr.req)) (tape (address-to-hex (snag 0 adr.req)))
|
||||
:- %a
|
||||
(turn adr.req (cork address-to-hex tape))
|
||||
::
|
||||
?~ top.req ~
|
||||
:+ ~ 'topics'
|
||||
(topics-to-json top.req)
|
||||
==
|
||||
::
|
||||
%eth-get-block-by-number
|
||||
:- 'eth_getBlockByNumber'
|
||||
:~ (tape (num-to-hex bon.req))
|
||||
b+txs.req
|
||||
==
|
||||
::
|
||||
%eth-get-filter-logs
|
||||
['eth_getFilterLogs' (tape (num-to-hex fid.req)) ~]
|
||||
::
|
||||
%eth-get-logs
|
||||
:- 'eth_getLogs'
|
||||
:_ ~
|
||||
:- %o %- ~(gas by *(map @t json))
|
||||
=- (murn - same)
|
||||
^- (list (unit (pair @t json)))
|
||||
:~ ?~ fro.req ~
|
||||
`['fromBlock' (block-to-json u.fro.req)]
|
||||
::
|
||||
?~ tob.req ~
|
||||
`['toBlock' (block-to-json u.tob.req)]
|
||||
::
|
||||
?: =(0 (lent adr.req)) ~
|
||||
:+ ~ 'address'
|
||||
?: =(1 (lent adr.req)) (tape (address-to-hex (snag 0 adr.req)))
|
||||
:- %a
|
||||
(turn adr.req (cork address-to-hex tape))
|
||||
::
|
||||
?~ top.req ~
|
||||
:+ ~ 'topics'
|
||||
(topics-to-json top.req)
|
||||
==
|
||||
::
|
||||
%eth-get-logs-by-hash
|
||||
:- 'eth_getLogs'
|
||||
:_ ~ :- %o
|
||||
%- ~(gas by *(map @t json))
|
||||
=- (murn - same)
|
||||
^- (list (unit (pair @t json)))
|
||||
:~ `['blockHash' (tape (transaction-to-hex has.req))]
|
||||
::
|
||||
?: =(0 (lent adr.req)) ~
|
||||
:+ ~ 'address'
|
||||
?: =(1 (lent adr.req)) (tape (address-to-hex (snag 0 adr.req)))
|
||||
:- %a
|
||||
(turn adr.req (cork address-to-hex tape))
|
||||
::
|
||||
?~ top.req ~
|
||||
:+ ~ 'topics'
|
||||
(topics-to-json top.req)
|
||||
==
|
||||
::
|
||||
%eth-get-filter-changes
|
||||
['eth_getFilterChanges' (tape (num-to-hex fid.req)) ~]
|
||||
::
|
||||
%eth-get-transaction-count
|
||||
:- 'eth_getTransactionCount'
|
||||
:~ (tape (address-to-hex adr.req))
|
||||
(block-to-json block.req)
|
||||
==
|
||||
::
|
||||
%eth-get-transaction-receipt
|
||||
['eth_getTransactionReceipt' (tape (transaction-to-hex txh.req)) ~]
|
||||
::
|
||||
%eth-send-raw-transaction
|
||||
['eth_sendRawTransaction' (tape (num-to-hex dat.req)) ~]
|
||||
==
|
||||
::
|
||||
++ eth-call-to-json
|
||||
=, enjs:format
|
||||
|= cal=call
|
||||
^- json
|
||||
:- %o %- ~(gas by *(map @t json))
|
||||
=- (murn - same)
|
||||
^- (list (unit (pair @t json)))
|
||||
:~ ?~ from.cal ~
|
||||
`['from' (tape (address-to-hex u.from.cal))]
|
||||
::
|
||||
`['to' (tape (address-to-hex to.cal))]
|
||||
::
|
||||
?~ gas.cal ~
|
||||
`['gas' (tape (num-to-hex u.gas.cal))]
|
||||
::
|
||||
?~ gas-price.cal ~
|
||||
`['gasPrice' (tape (num-to-hex u.gas-price.cal))]
|
||||
::
|
||||
?~ value.cal ~
|
||||
`['value' (tape (num-to-hex u.value.cal))]
|
||||
::
|
||||
?~ data.cal ~
|
||||
`['data' (tape data.cal)]
|
||||
==
|
||||
::
|
||||
++ block-to-json
|
||||
|= dob=block
|
||||
^- json
|
||||
?- -.dob
|
||||
%number s+(crip '0' 'x' ((x-co:co 1) n.dob))
|
||||
%label s+l.dob
|
||||
==
|
||||
::
|
||||
++ topics-to-json
|
||||
|= tos=(list ?(@ux (list @ux)))
|
||||
^- json
|
||||
:- %a
|
||||
=/ ttj
|
||||
;: cork
|
||||
(cury render-hex-bytes 32)
|
||||
prefix-hex
|
||||
tape:enjs:format
|
||||
==
|
||||
%+ turn tos
|
||||
|= t=?(@ (list @))
|
||||
?@ t
|
||||
?: =(0 t) ~
|
||||
(ttj `@`t)
|
||||
a+(turn t ttj)
|
||||
::
|
||||
:: parsing responses
|
||||
::
|
||||
::TODO ++ parse-response |= json ^- response
|
||||
::
|
||||
++ parse-hex-result
|
||||
|= j=json
|
||||
^- @
|
||||
?> ?=(%s -.j)
|
||||
(hex-to-num p.j)
|
||||
::
|
||||
++ parse-eth-new-filter-res parse-hex-result
|
||||
::
|
||||
++ parse-eth-block-number parse-hex-result
|
||||
::
|
||||
++ parse-transaction-hash parse-hex-result
|
||||
::
|
||||
++ parse-eth-get-transaction-count parse-hex-result
|
||||
::
|
||||
++ parse-event-logs
|
||||
(ar:dejs:format parse-event-log)
|
||||
::
|
||||
++ parse-event-log
|
||||
=, dejs:format
|
||||
|= log=json
|
||||
^- event-log
|
||||
=- ((ot -) log)
|
||||
:~ =- ['logIndex'^(cu - (mu so))]
|
||||
|= li=(unit @t)
|
||||
?~ li ~
|
||||
=- `((ou -) log) ::TODO not sure if elegant or hacky.
|
||||
:~ 'logIndex'^(un (cu hex-to-num so))
|
||||
'transactionIndex'^(un (cu hex-to-num so))
|
||||
'transactionHash'^(un (cu hex-to-num so))
|
||||
'blockNumber'^(un (cu hex-to-num so))
|
||||
'blockHash'^(un (cu hex-to-num so))
|
||||
'removed'^(uf | bo)
|
||||
==
|
||||
::
|
||||
address+(cu hex-to-num so)
|
||||
data+so
|
||||
::
|
||||
=- topics+(cu - (ar so))
|
||||
|= r=(list @t)
|
||||
^- (lest @ux)
|
||||
?> ?=([@t *] r)
|
||||
:- (hex-to-num i.r)
|
||||
(turn t.r hex-to-num)
|
||||
==
|
||||
--
|
||||
::
|
||||
:: utilities
|
||||
::TODO give them better homes!
|
||||
::
|
||||
++ num-to-hex
|
||||
|= n=@
|
||||
^- tape
|
||||
%- prefix-hex
|
||||
?: =(0 n)
|
||||
"0"
|
||||
%- render-hex-bytes
|
||||
(as-octs:mimes:html n)
|
||||
::
|
||||
++ address-to-hex
|
||||
|= a=address
|
||||
^- tape
|
||||
%- prefix-hex
|
||||
(render-hex-bytes 20 `@`a)
|
||||
::
|
||||
++ transaction-to-hex
|
||||
|= h=@
|
||||
^- tape
|
||||
%- prefix-hex
|
||||
(render-hex-bytes 32 h)
|
||||
::
|
||||
++ prefix-hex
|
||||
|= a=tape
|
||||
^- tape
|
||||
['0' 'x' a]
|
||||
::
|
||||
++ render-hex-bytes
|
||||
:: atom to string of hex bytes without 0x prefix and dots.
|
||||
|= a=octs
|
||||
^- tape
|
||||
((x-co:co (mul 2 p.a)) q.a)
|
||||
::
|
||||
++ pad-to-multiple
|
||||
|= [wat=tape mof=@ud wer=?(%left %right)]
|
||||
^- tape
|
||||
=+ len=(lent wat)
|
||||
?: =(0 len) (reap mof '0')
|
||||
=+ mad=(mod len mof)
|
||||
?: =(0 mad) wat
|
||||
=+ tad=(reap (sub mof mad) '0')
|
||||
%- weld
|
||||
?:(?=(%left wer) [tad wat] [wat tad])
|
||||
::
|
||||
++ hex-to-num
|
||||
|= a=@t
|
||||
(rash (rsh [3 2] a) hex)
|
||||
--
|
1
pkg/landscape/lib/ethereum.hoon
Symbolic link
1
pkg/landscape/lib/ethereum.hoon
Symbolic link
@ -0,0 +1 @@
|
||||
../../base-dev/lib/ethereum.hoon
|
@ -1,562 +0,0 @@
|
||||
/- sur=hark-store, post
|
||||
/+ resource, graph-store, group-store
|
||||
^?
|
||||
=< [. sur]
|
||||
=, sur
|
||||
|%
|
||||
++ upgrade
|
||||
|%
|
||||
++ to-three
|
||||
=* two state-two
|
||||
=* three state-three
|
||||
|%
|
||||
++ index
|
||||
|= =index:two
|
||||
^- (unit index:three)
|
||||
`index
|
||||
++ contents
|
||||
|= =contents:two
|
||||
^- (unit contents:three)
|
||||
?. ?=(%group -.contents)
|
||||
`contents
|
||||
=- ?: =(~ -) ~
|
||||
`[%group -]
|
||||
%+ murn list.contents
|
||||
|= =group-contents:two
|
||||
^- (unit group-contents:three)
|
||||
?: ?=(?(%add %remove) -.group-contents)
|
||||
~
|
||||
`group-contents
|
||||
::
|
||||
++ stats-index
|
||||
|= =stats-index:two
|
||||
^- (unit stats-index:three)
|
||||
`stats-index
|
||||
::
|
||||
++ notifications
|
||||
upg-notifications:upg
|
||||
::
|
||||
++ upg
|
||||
%. [index stats-index contents]
|
||||
%: upgrade
|
||||
index:two
|
||||
stats-index:two
|
||||
contents:two
|
||||
index:three
|
||||
stats-index:three
|
||||
contents:three
|
||||
==
|
||||
--
|
||||
::
|
||||
++ to-four
|
||||
=* three state-three
|
||||
=* four state-four
|
||||
|%
|
||||
++ index
|
||||
|= =index:three
|
||||
^- (unit index:four)
|
||||
`index
|
||||
++ contents
|
||||
|= =contents:three
|
||||
^- (unit contents:four)
|
||||
?. ?=(%graph -.contents)
|
||||
`contents
|
||||
`[%graph (turn list.contents post-to-one:upgrade:graph-store)]
|
||||
::
|
||||
++ unreads-each
|
||||
upg-unreads-each:upg
|
||||
::
|
||||
++ notifications
|
||||
upg-notifications:upg
|
||||
::
|
||||
++ stats-index
|
||||
|= =stats-index:three
|
||||
^- (unit stats-index:four)
|
||||
`stats-index
|
||||
::
|
||||
++ upg
|
||||
%. [index stats-index contents]
|
||||
%: upgrade
|
||||
index:three
|
||||
stats-index:three
|
||||
contents:three
|
||||
index:four
|
||||
stats-index:four
|
||||
contents:four
|
||||
==
|
||||
--
|
||||
::
|
||||
++ to-five
|
||||
=* four state-four
|
||||
=* five sur
|
||||
|%
|
||||
++ mark
|
||||
|= module=@t
|
||||
^- (unit @t)
|
||||
?+ module ~
|
||||
%chat `%graph-validator-chat
|
||||
%publish `%graph-validator-publish
|
||||
%link `%graph-validator-link
|
||||
==
|
||||
++ index
|
||||
|= =index:four
|
||||
^- (unit index:five)
|
||||
?: ?=(%group -.index)
|
||||
`index
|
||||
=* i index
|
||||
`[%graph graph.i (mark module.i) description.i index.i]
|
||||
::
|
||||
++ contents
|
||||
|= =contents:four
|
||||
^- (unit contents:five)
|
||||
`contents
|
||||
::
|
||||
++ unreads-each
|
||||
upg-unreads-each:upg
|
||||
::
|
||||
++ stats-index
|
||||
|= =stats-index:four
|
||||
^- (unit stats-index:five)
|
||||
`stats-index
|
||||
::
|
||||
++ upg
|
||||
%. [index stats-index contents]
|
||||
%: upgrade
|
||||
index:four
|
||||
stats-index:four
|
||||
contents:four
|
||||
index:five
|
||||
stats-index:five
|
||||
contents:five
|
||||
==
|
||||
|
||||
++ notifications
|
||||
upg-notifications:upg
|
||||
--
|
||||
::
|
||||
++ upgrade
|
||||
|* $: :: input molds
|
||||
in-index=mold
|
||||
in-stats-index=mold
|
||||
in-contents=mold
|
||||
:: output molds
|
||||
out-index=mold
|
||||
out-stats-index=mold
|
||||
out-contents=mold
|
||||
==
|
||||
=> . =>
|
||||
|%
|
||||
::
|
||||
++ in
|
||||
|%
|
||||
::
|
||||
+$ index in-index
|
||||
+$ stats-index in-stats-index
|
||||
+$ contents in-contents
|
||||
+$ unreads-each (jug stats-index index)
|
||||
+$ timebox (map index notification)
|
||||
+$ notification
|
||||
[date=@da read=? =contents]
|
||||
++ orm
|
||||
((ordered-map time timebox) gth)
|
||||
+$ notifications
|
||||
((mop time timebox) gth)
|
||||
--
|
||||
++ out
|
||||
|%
|
||||
::
|
||||
::
|
||||
+$ index out-index
|
||||
+$ stats-index out-stats-index
|
||||
+$ contents out-contents
|
||||
+$ timebox (map out-index notification)
|
||||
+$ unreads-each (jug stats-index index)
|
||||
+$ notification
|
||||
[date=@da read=? contents=out-contents]
|
||||
+$ notifications
|
||||
((mop time timebox) gth)
|
||||
++ orm
|
||||
((ordered-map time timebox) gth)
|
||||
--
|
||||
--
|
||||
|= $: fun-index=$-(index:in (unit index:out))
|
||||
fun-stats-index=$-(stats-index:in (unit stats-index:out))
|
||||
fun-contents=$-(contents:in (unit contents:out))
|
||||
==
|
||||
|%
|
||||
::
|
||||
++ upg-unreads-each
|
||||
|= =unreads-each:in
|
||||
^- unreads-each:out
|
||||
%- ~(gas by *unreads-each:out)
|
||||
%+ murn ~(tap by unreads-each)
|
||||
|= [=stats-index:in indices=(set index:in)]
|
||||
^- (unit [stats-index:out (set index:out)])
|
||||
=/ new-stats
|
||||
(fun-stats-index stats-index)
|
||||
?~ new-stats ~
|
||||
=/ new-indices
|
||||
(upg-indices indices)
|
||||
?: =(0 ~(wyt ^in new-indices)) ~
|
||||
`[u.new-stats new-indices]
|
||||
::
|
||||
++ upg-indices
|
||||
|= indices=(set index:in)
|
||||
^- (set index:out)
|
||||
%- ~(gas ^in *(set index:out))
|
||||
(murn ~(tap ^in indices) fun-index)
|
||||
::
|
||||
++ upg-notifications
|
||||
|= =notifications:in
|
||||
^- notifications:out
|
||||
%+ gas:orm:out *notifications:out
|
||||
^- (list [@da timebox:out])
|
||||
%+ murn (tap:orm:in notifications)
|
||||
|= [time=@da =timebox:in]
|
||||
^- (unit [@da =timebox:out])
|
||||
=/ new-timebox=timebox:out
|
||||
(upg-timebox timebox)
|
||||
?: =(0 ~(wyt by timebox))
|
||||
~
|
||||
`[time new-timebox]
|
||||
::
|
||||
++ upg-timebox
|
||||
|= =timebox:in
|
||||
^- timebox:out
|
||||
%- ~(gas by *timebox:out)
|
||||
%+ murn ~(tap by timebox)
|
||||
|= [=index:in =notification:in]
|
||||
^- (unit [index:out notification:out])
|
||||
=/ new-index
|
||||
(fun-index index)
|
||||
?~ new-index ~
|
||||
=/ new-notification
|
||||
(upg-notification notification)
|
||||
?~ new-notification ~
|
||||
`[u.new-index u.new-notification]
|
||||
::
|
||||
++ upg-notification
|
||||
|= n=notification:in
|
||||
^- (unit notification:out)
|
||||
=/ new-contents
|
||||
(fun-contents contents.n)
|
||||
?~ new-contents ~
|
||||
`[date.n read.n u.new-contents]
|
||||
--
|
||||
--
|
||||
|
||||
++ dejs
|
||||
=, dejs:format
|
||||
|%
|
||||
++ index
|
||||
%- of
|
||||
:~ graph+graph-index
|
||||
group+group-index
|
||||
==
|
||||
::
|
||||
++ group-index
|
||||
%- ot
|
||||
:~ group+dejs-path:resource
|
||||
description+so
|
||||
==
|
||||
::
|
||||
++ graph-index
|
||||
%- ot
|
||||
:~ graph+dejs-path:resource
|
||||
mark+(mu so)
|
||||
description+so
|
||||
index+(su ;~(pfix fas (more fas dem)))
|
||||
==
|
||||
::
|
||||
++ stats-index
|
||||
%- of
|
||||
:~ graph+graph-stats-index
|
||||
group+dejs-path:resource
|
||||
==
|
||||
++ graph-stats-index
|
||||
%- ot
|
||||
:~ graph+dejs-path:resource
|
||||
index+graph-store-index
|
||||
==
|
||||
:: parse date as @ud
|
||||
:: TODO: move to zuse
|
||||
++ sd
|
||||
|= jon=json
|
||||
^- @da
|
||||
?> ?=(%s -.jon)
|
||||
`@da`(rash p.jon dem:ag)
|
||||
::
|
||||
++ notif-ref
|
||||
^- $-(json [(unit @da) ^index])
|
||||
%- ot
|
||||
:~ time+(mu sd)
|
||||
index+index
|
||||
==
|
||||
++ graph-store-index
|
||||
(su ;~(pfix fas (more fas dem)))
|
||||
::
|
||||
++ add
|
||||
|= jon=json
|
||||
[*^index *notification]
|
||||
::
|
||||
++ read-graph-index
|
||||
%- ot
|
||||
:~ index+stats-index
|
||||
target+graph-store-index
|
||||
==
|
||||
::
|
||||
++ action
|
||||
^- $-(json ^action)
|
||||
%- of
|
||||
:~ seen+ul
|
||||
archive+notif-ref
|
||||
read-note+index
|
||||
add-note+add
|
||||
set-dnd+bo
|
||||
read-count+stats-index
|
||||
read-graph+dejs-path:resource
|
||||
read-group+dejs-path:resource
|
||||
read-each+read-graph-index
|
||||
read-all+ul
|
||||
==
|
||||
--
|
||||
::
|
||||
++ enjs
|
||||
=, enjs:format
|
||||
|%
|
||||
++ update
|
||||
|= upd=^update
|
||||
^- json
|
||||
|^
|
||||
%+ frond -.upd
|
||||
?+ -.upd a+~
|
||||
%added (added +.upd)
|
||||
%timebox (timebox +.upd)
|
||||
%set-dnd b+dnd.upd
|
||||
%count (numb count.upd)
|
||||
%more (more +.upd)
|
||||
%read-each (read-each +.upd)
|
||||
%read-count (stats-index +.upd)
|
||||
%unread-each (unread-each +.upd)
|
||||
%unread-count (unread-count +.upd)
|
||||
%remove-graph s+(enjs-path:resource +.upd)
|
||||
%seen-index (seen-index +.upd)
|
||||
%unreads (unreads +.upd)
|
||||
%read-note (index +.upd)
|
||||
%note-read (note-read +.upd)
|
||||
::
|
||||
%archive
|
||||
(notif-ref +.upd)
|
||||
==
|
||||
::
|
||||
++ note-read
|
||||
|= [tim=@da idx=^index]
|
||||
%- pairs
|
||||
:~ time+s+(scot %ud tim)
|
||||
index+(index idx)
|
||||
==
|
||||
::
|
||||
++ stats-index
|
||||
|= s=^stats-index
|
||||
%+ frond -.s
|
||||
|^
|
||||
?- -.s
|
||||
%graph (graph-stats-index +.s)
|
||||
%group s+(enjs-path:resource +.s)
|
||||
==
|
||||
::
|
||||
++ graph-stats-index
|
||||
|= [graph=resource =index:graph-store]
|
||||
%- pairs
|
||||
:~ graph+s+(enjs-path:resource graph)
|
||||
index+(index:enjs:graph-store index)
|
||||
==
|
||||
--
|
||||
::
|
||||
++ unreads
|
||||
|= l=(list [^stats-index ^stats])
|
||||
^- json
|
||||
:- %a
|
||||
^- (list json)
|
||||
%+ turn l
|
||||
|= [idx=^stats-index s=^stats]
|
||||
%- pairs
|
||||
:~ stats+(stats s)
|
||||
index+(stats-index idx)
|
||||
==
|
||||
::
|
||||
++ unread
|
||||
|= =^unreads
|
||||
%+ frond
|
||||
-.unreads
|
||||
?- -.unreads
|
||||
%each a+(turn ~(tap by indices.unreads) index:enjs:graph-store)
|
||||
::
|
||||
%count
|
||||
(numb num.unreads)
|
||||
==
|
||||
::
|
||||
++ stats
|
||||
|= s=^stats
|
||||
^- json
|
||||
%- pairs
|
||||
:~ unreads+(unread unreads.s)
|
||||
last+(time last-seen.s)
|
||||
==
|
||||
++ added
|
||||
|= [idx=^index not=^notification]
|
||||
^- json
|
||||
%- pairs
|
||||
:~ index+(index idx)
|
||||
notification+(notification not)
|
||||
==
|
||||
::
|
||||
++ notif-ref
|
||||
|= [tim=(unit @da) idx=^index]
|
||||
^- json
|
||||
%- pairs
|
||||
:~ [%time ?~(tim ~ s+(scot %ud u.tim))]
|
||||
index+(index idx)
|
||||
==
|
||||
++ seen-index
|
||||
|= [tim=@da idx=^stats-index]
|
||||
^- json
|
||||
%- pairs
|
||||
:~ time+(time tim)
|
||||
index+(stats-index idx)
|
||||
==
|
||||
::
|
||||
++ more
|
||||
|= upds=(list ^update)
|
||||
^- json
|
||||
a+(turn upds update)
|
||||
::
|
||||
++ index
|
||||
|= =^index
|
||||
%+ frond -.index
|
||||
|^
|
||||
?- -.index
|
||||
%graph (graph-index +.index)
|
||||
%group (group-index +.index)
|
||||
==
|
||||
::
|
||||
++ graph-index
|
||||
|= $: graph=resource
|
||||
mark=(unit mark)
|
||||
description=@t
|
||||
idx=index:graph-store
|
||||
==
|
||||
^- json
|
||||
%- pairs
|
||||
:~ graph+s+(enjs-path:resource graph)
|
||||
mark+s+(fall mark '')
|
||||
description+s+description
|
||||
index+(index:enjs:graph-store idx)
|
||||
==
|
||||
::
|
||||
++ group-index
|
||||
|= [group=resource description=@t]
|
||||
^- json
|
||||
%- pairs
|
||||
:~ group+s+(enjs-path:resource group)
|
||||
description+s+description
|
||||
==
|
||||
--
|
||||
::
|
||||
++ notification
|
||||
|= ^notification
|
||||
^- json
|
||||
%- pairs
|
||||
:~ time+(time date)
|
||||
contents+(^contents contents)
|
||||
==
|
||||
::
|
||||
++ contents
|
||||
|= =^contents
|
||||
^- json
|
||||
%+ frond -.contents
|
||||
|^
|
||||
?- -.contents
|
||||
%graph (graph-contents +.contents)
|
||||
%group (group-contents +.contents)
|
||||
==
|
||||
::
|
||||
++ graph-contents
|
||||
|= =(list post:post)
|
||||
^- json
|
||||
:- %a
|
||||
(turn list post:enjs:graph-store)
|
||||
::
|
||||
++ group-contents
|
||||
|= =(list ^group-contents)
|
||||
^- json
|
||||
:- %a
|
||||
%+ turn list
|
||||
|= =^group-contents
|
||||
(update:enjs:group-store group-contents)
|
||||
--
|
||||
::
|
||||
++ indexed-notification
|
||||
|= [=^index =^notification]
|
||||
%- pairs
|
||||
:~ index+(^index index)
|
||||
notification+(^notification notification)
|
||||
==
|
||||
::
|
||||
++ timebox
|
||||
|= [tim=(unit @da) l=(list [^index ^notification])]
|
||||
^- json
|
||||
%- pairs
|
||||
:~ time+`json`?~(tim ~ s+(scot %ud u.tim))
|
||||
:- %notifications
|
||||
^- json
|
||||
:- %a
|
||||
%+ turn l
|
||||
|= [=^index =^notification]
|
||||
^- json
|
||||
(indexed-notification index notification)
|
||||
==
|
||||
::
|
||||
++ read-each
|
||||
|= [s=^stats-index target=index:graph-store]
|
||||
%- pairs
|
||||
:~ index+(stats-index s)
|
||||
target+(index:enjs:graph-store target)
|
||||
==
|
||||
::
|
||||
++ unread-each
|
||||
|= [s=^stats-index target=index:graph-store tim=@da]
|
||||
%- pairs
|
||||
:~ index+(stats-index s)
|
||||
target+(index:enjs:graph-store target)
|
||||
last+(time tim)
|
||||
==
|
||||
::
|
||||
++ unread-count
|
||||
|= [s=^stats-index tim=@da]
|
||||
%- pairs
|
||||
:~ index+(stats-index s)
|
||||
last+(time tim)
|
||||
==
|
||||
--
|
||||
--
|
||||
::
|
||||
++ to-stats-index
|
||||
|= =index
|
||||
^- stats-index
|
||||
?- -.index
|
||||
%graph [%graph graph.index index.index]
|
||||
%group [%group group.index]
|
||||
==
|
||||
++ stats-index-is-index
|
||||
|= [=stats-index =index]
|
||||
?- -.index
|
||||
%graph
|
||||
?. ?=(%graph -.stats-index) %.n
|
||||
=([graph index]:index [graph index]:stats-index)
|
||||
::
|
||||
%group
|
||||
?. ?=(%group -.stats-index) %.n
|
||||
=(group:index group:stats-index)
|
||||
==
|
||||
--
|
@ -1 +0,0 @@
|
||||
../../base-dev/lib/treaty.hoon
|
@ -1,13 +0,0 @@
|
||||
/+ *hark-store
|
||||
|_ act=action
|
||||
++ grad %noun
|
||||
++ grow
|
||||
|%
|
||||
++ noun act
|
||||
--
|
||||
++ grab
|
||||
|%
|
||||
++ noun action
|
||||
++ json action:dejs
|
||||
--
|
||||
--
|
@ -1,15 +0,0 @@
|
||||
/+ *hark-store
|
||||
|_ upd=update
|
||||
++ grad %noun
|
||||
++ grow
|
||||
|%
|
||||
++ noun upd
|
||||
++ json
|
||||
%+ frond:enjs:format 'harkUpdate'
|
||||
(update:enjs upd)
|
||||
--
|
||||
++ grab
|
||||
|%
|
||||
++ noun update
|
||||
--
|
||||
--
|
@ -1,21 +0,0 @@
|
||||
:: json-rpc: protocol types
|
||||
::
|
||||
|%
|
||||
+$ request
|
||||
$: id=@t
|
||||
method=@t
|
||||
params=request-params
|
||||
==
|
||||
::
|
||||
+$ request-params
|
||||
$% [%list (list json)]
|
||||
[%object (list (pair @t json))]
|
||||
==
|
||||
+$ response
|
||||
$~ [%fail *httr:eyre]
|
||||
$% [%result id=@t res=json]
|
||||
[%error id=@t code=@t message=@t] ::TODO data?
|
||||
[%fail hit=httr:eyre]
|
||||
[%batch bas=(list response)]
|
||||
==
|
||||
--
|
@ -1,95 +0,0 @@
|
||||
:: Note: these are for BTC testnet
|
||||
::
|
||||
/- spider, rpc=json-rpc
|
||||
/+ strandio, bc=bitcoin, bcu=bitcoin-utils
|
||||
=, strand=strand:spider
|
||||
=>
|
||||
|%
|
||||
++ url1 "http://localhost:50002"
|
||||
++ addr ^-(address:bc [%bech32 'bc1q39wus23jwe7m2j7xmrfr2svhrtejmsn262x3j2'])
|
||||
++ btc-req
|
||||
^- request:http
|
||||
=, enjs:format
|
||||
:* method=%'POST'
|
||||
url=`@ta`(crip (weld url1 "/btc-rpc"))
|
||||
header-list=['Content-Type'^'application/json' ~]
|
||||
^= body
|
||||
%- some
|
||||
%- as-octt:mimes:html
|
||||
%- en-json:html
|
||||
%- pairs
|
||||
:~ jsonrpc+s+'2.0'
|
||||
id+s+'block-info'
|
||||
method+s+'getblockchaininfo'
|
||||
==
|
||||
==
|
||||
++ electrs-req
|
||||
^- request:http
|
||||
=, enjs:format
|
||||
:* method=%'POST'
|
||||
url=`@ta`(crip (weld url1 "/electrs-rpc"))
|
||||
header-list=['Content-Type'^'application/json' ~]
|
||||
^= body
|
||||
%- some
|
||||
%- as-octt:mimes:html
|
||||
%- en-json:html
|
||||
%- pairs
|
||||
:~ jsonrpc+s+'2.0'
|
||||
id+s+'list-unspent'
|
||||
method+s+'blockchain.scripthash.listunspent'
|
||||
params+a+~[[%s '34aae877286aa09828803af27ce2315e72c4888efdf74d7d067c975b7c558789']]
|
||||
==
|
||||
==
|
||||
::
|
||||
:: convert address to Electrs ScriptHash that it uses to index
|
||||
:: big-endian sha256 of the output script
|
||||
::
|
||||
++ electrs-script-hash
|
||||
|= a=address:bc
|
||||
^- hexb:bc
|
||||
%- flip:byt:bcu
|
||||
%- sha256:bcu
|
||||
(to-script-pubkey:adr:bc a)
|
||||
::
|
||||
++ parse-json-rpc
|
||||
|= =json
|
||||
^- (unit response:rpc)
|
||||
=/ 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 ~) ~)
|
||||
::
|
||||
++ parse-response
|
||||
|= =client-response:iris
|
||||
=/ m (strand:strandio ,(unit response:rpc))
|
||||
^- 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 ~)
|
||||
(pure:m (parse-json-rpc u.jon))
|
||||
::
|
||||
++ attempt-request
|
||||
|= =request:http
|
||||
=/ m (strand:strandio ,~)
|
||||
^- form:m
|
||||
(send-request:strandio request)
|
||||
--
|
||||
^- thread:spider
|
||||
|= arg=vase
|
||||
:: =+ !<([~ a=@ud] arg)
|
||||
=/ m (strand ,vase)
|
||||
^- form:m
|
||||
;< ~ bind:m (attempt-request electrs-req)
|
||||
;< rep=client-response:iris bind:m
|
||||
take-client-response:strandio
|
||||
;< rpc-resp=(unit response:rpc) bind:m (parse-response rep)
|
||||
(pure:m !>(rpc-resp))
|
@ -1,13 +0,0 @@
|
||||
/- spider, rpc=json-rpc
|
||||
/+ strandio, bcu=bitcoin-utils
|
||||
=, strand=strand:spider
|
||||
=>
|
||||
|%
|
||||
++ blah 2
|
||||
--
|
||||
^- thread:spider
|
||||
|= arg=vase
|
||||
:: =+ !<([~ a=@ud] arg)
|
||||
=/ m (strand ,vase)
|
||||
^- form:m
|
||||
(pure:m !>(blah))
|
Loading…
Reference in New Issue
Block a user