diff --git a/app/constitution.hoon b/app/constitution.hoon index 9d704858ac..53aaa176f9 100644 --- a/app/constitution.hoon +++ b/app/constitution.hoon @@ -5,13 +5,18 @@ =, eyre |% ++ state - $: ships=registry - block=@ud - filter=(unit @ud) - ships-c=address + $: ships=(map @p hull) + block=@ud :: last heard + filter=(unit @ud) :: our filter id == :: -++ move [bone card] :: [target side-effect] +++ complete-ship + $: state=hull + history=(list diff-hull) :: newest first + keys=(map @ud (pair @ @)) + == +:: ++= move [bone card] :: [target side-effect] ++ card :: side-effect $% [%peer wire gill:gall path] [%hiss wire (unit user:eyre) mark [%hiss hiss]] @@ -23,50 +28,129 @@ ++ prep |= old=(unit *) :: ?~ old - init + ta-save:ta-init:ta :: [~ ..prep(fid u.old)] :: -++ init - =/ sc=address - 0xa9c7.9b9c.5e4e.1fdc.69c1. - 9fc0.6232.64c8.da50.7a22 - :_ ..init(ships-c sc) - =- [ost.bol -]~ - %+ rpc-req /init - %- batch-read-request - %+ turn (gulf ~zod ~per) :: ~fes) - |= p=@p - :+ `(scot %p p) sc - ['getShipData(uint32)' ~[uint+`@`p]] +++ ta + |_ $: moves=(list move) :: side-effects + reqs=(list (pair (unit @t) request)) :: rpc requests + wir=wire :: wire for reqs + == + +* this . + :: + ++ ta-save + ^- (quip move _+>) + =- [[`move`- `(list move)`(flop moves)] ..ta] + ^- move + :- `bone`ost.bol + ^- card + %+ rpc-request:ca wir + `json`a+(turn (flop reqs) request-to-json) + :: + ++ ta-move + |= mov=move + %_(+> moves [mov moves]) + :: + ++ ta-card + |= car=card + (ta-move [ost.bol car]) + :: + ++ ta-request + |= [id=(unit @t) req=request] + %_(+> reqs [[id req] reqs]) + :: + ++ ta-read + |= cal=ships:function + =- %+ ta-request `id + :+ %eth-call + [~ ships:contracts ~ ~ ~ (encode-call dat)] + [%label %latest] + ::TODO probably turn the below into a lib arm + ^- [id=@t dat=call-data] + ?- -.cal + %ships + :- (crip "ships({(scow %p who.cal)})") + ['ships(uint32)' ~[uint+`@`who.cal]] + == + :: + ++ ta-read-ships + |= who=(list @p) + ~& [%ta-read-ships ~(key by ships)] + %^ spir who this + |=([p=@p _this] (ta-read %ships p)) + :: + :: + ++ ta-init + %- ta-read-ships(wir /init) + (gulf ~zod ~per) ::TODO ~fes) + :: + ++ ta-init-result + |= rep=response:json-rpc + ^+ this + ?> ?=(%batch -.rep) + =. wir /init + %^ spir bas.rep this + |= [r=response:json-rpc this=_this] + ^+ this + ?< ?=(%batch -.r) + ~& id.r + ?: ?=(%error -.r) + ~& [%rpc-error message.r] + this + ?> ?=(%s -.res.r) + =/ hul=hull:eth-noun + (decode-results p.res.r hull:eth-type) + ?. active.hul this + =/ who=@p + %+ rash id.r + (ifix [(jest 'ships(~') (just ')')] fed:ag) + =. ships + %+ ~(put by ships) who + (hull-from-eth hul) + ~& [%stored ~(key by ships)] + (ta-read-ships (kids who)) + -- :: -++ rpc-req - |= [w=wire j=json] - ^- card - :^ %hiss w ~ - :+ %json-rpc-response %hiss - =- (json-request - j) - =+ (need (de-purl:html 'http://localhost:8545')) - -(p.p |) +:: arms for card generation +++ ca + |% + ++ rpc-request + |= [w=wire j=json] + ^- card + :^ %hiss w ~ + :+ %json-rpc-response %hiss + =- (json-request - j) + =+ (need (de-purl:html 'http://localhost:8545')) + -(p.p |) + -- :: -++ sigh-json-rpc-response-init - |= [w=wire rep=response:json-rpc] - ~& [%res rep] - ?> ?=(%batch -.rep) - =- ~& [%ship-data `(list (pair ship hull))`-] - [~ +>.$(ships (~(gas in ships) -))] - %+ murn bas.rep - ::TODO ++parse-ship-data into lib - |= r=response:json-rpc - ^- (unit (pair ship hull)) - ?: ?=(%error -.r) ~ ::TODO retry on error? - ?> ?=(%result -.r) - ?> ?=(%s -.res.r) - =/ hul=hull:eth-noun - (decode-results p.res.r hull:eth-type) - :: don't care about latent ships. - ?. active.hul ~ - :+ ~ (slav %p id.r) - (hull-from-eth hul) +++ spir + :> + :> a: list + :> b: state + :> c: gate from list-item and state to new state + :> produces: new state + |* [a=(list) b=* c=_|=(^ +<+)] + => .(c `$-([_?>(?=(^ a) i.a) _b] _b)`c) + :> transformed list and updated state + |- ^+ b + ?~ a b + $(a t.a, b (c i.a b)) +:: +++ kids + |= pre=@p + ^- (list @p) + =/ wyd=bloq + ?+ (clan:title pre) 0 + %czar 3 + %king 4 + %duke 5 + == + %+ turn + (gulf 1 (dec (pow 2 (bex wyd)))) + ?: =(~zod pre) + |=(a=@p (lsh 3 1 a)) + |=(a=@p (cat wyd pre a)) :: ::TODO there definitely needs to be a helper function of some kind, :: but is there a way for the type system to be aware of the return @@ -96,51 +180,22 @@ :: ++ poke-noun |= a/@ - =+ ships-c=0xa9c7.9b9c.5e4e.1fdc.69c1.9fc0.6232.64c8.da50.7a22 - ?: =(a 1) - %+ send-rpc-req /block - (request-to-json `'eth-blocknum' [%eth-block-number ~]) - ?: =(a 2) - %+ send-rpc-req /call - %- batch-read-request - :~ :+ `'ships-of 0x0' - ships-c - ['getOwnedShips(address)' ~[address+0x0]] - :: - :+ `'ship-data 0' - ships-c - ['getShipData(uint32)' ~[uint+0]] - == - ?: =(a 3) - ~& %making-filter - %+ send-rpc-req /new-filter - %+ request-to-json `'new-filter' - [%eth-new-filter ~ ~ ~[ships-c] ~] - ?: =(a 4) - ~& [%asking-filter-update (need filter)] - %+ send-rpc-req /filter-update - %+ request-to-json `'req-iq' - [%eth-get-filter-changes (need filter)] + ?: =(a 0) + ~& [%have-ships ~(key by ships)] + [~ +>.$] [~ +>.$] :: -++ send-move - |= c/card - [[ost.bol c]~ +>.$] -:: -++ send-rpc-req - |= [w=wire j=json] - %^ send-move %hiss w - :^ ~ %json-rpc-response %hiss - =- (json-request - j) - =+ (need (de-purl:html 'http://localhost:8545')) - -(p.p |) -:: ++ sigh-tang |= [w=wire t=tang] ~& [%failed-sigh] ~& (turn t (cury wash [0 80])) [~ +>.$] :: +++ sigh-json-rpc-response-init + |= [w=wire r=response:json-rpc] + ~& %got-init-response + ta-save:(ta-init-result:ta r) +:: ++ sigh-json-rpc-response |= [w=wire r=response:json-rpc] ~& [%rpc-resp w r] diff --git a/sur/constitution.hoon b/sur/constitution.hoon index 12560da867..7a5da96710 100644 --- a/sur/constitution.hoon +++ b/sur/constitution.hoon @@ -2,9 +2,7 @@ =, ethereum |% :: -:: shapes -:: -++ registry (map @p hull) +:: # shapes :: ++ hull $: owner=address @@ -51,37 +49,64 @@ transfer-proxy=address == -- +:: +++ function + |% + ++ ships + $% [%ships who=@p] + == + -- +:: +:: # diffs +:: +++ diff-hull + $% [%full new=hull] + [%owner new=address] + [%spawn-count ~] :: increments + [%keys enc=@ aut=@] + [%sponsor new=@p] + [%escape new=(unit @p)] + [%spawn-proxy new=address] + [%transfer-proxy new=address] == :: -:: constants +:: # constants +:: +:: contract addresses +++ contracts + |% + ++ ships + 0xe083.4579.269e.ac6b.eca2. + 882a.6a21.f6fb.0b1d.7196 + -- :: :: hashes of ship event signatures ++ ships-events |% :: - :: ChangedPilot(uint32,address) - ++ changed-pilot - 0xb041.b798.8638.1a51.f9c6.29fb.4afc.6ab2. - 5059.09f4.d12e.168d.0ffc.bcb9.d78c.9179 + :: Transferred(uint32,address) + ++ transferred + 0x9014.bd16.807a.ce11.f497.2993.3667.4031. + 8029.4d9f.0e4f.42a1.5be6.0d26.5369.171c :: - :: ChangedStatus(uint32,uint8,uint64) - ++ changed-status - 0x7d33.b6e7.2395.c6e3.c518.9773.7331.77c1. - 5ba8.9ed5.0e0e.30ca.ebaa.3877.9a3e.1a79 + :: Activated(uint32) + ++ activated + 0xe74c.0380.9d07.69e1.b1f7.06cc.8414.258c. + d1f3.b6fe.020c.d15d.0165.c210.ba50.3a0f :: - :: ChangedEscape(uint32,uint32) - ++ changed-escape - 0x7de2.bea0.d602.2858.c601.a403.71b6.3de0. - 2940.cda9.6fef.97e4.318b.65cf.de91.5d79 + :: EscapeRequested(uint32,uint32) + ++ escape-requested + 0xb4d4.850b.8f21.8218.141c.5665.cba3.79e5. + 3e9b.b015.b51e.8d93.4be7.0210.aead.874a :: - :: ChangedSponsor(uint32,uint32) - ++ changed-sponsor - 0x7941.482b.dede.7ff1.c27c.f2c6.e768.2155. - a893.029d.c4a6.c619.8279.28fe.6031.9db4 + :: EscapeAccepted(uint32,uint32) + ++ escape-accepted + 0x7e44.7c9b.1bda.4b17.4b07.96e1.00bf.7f34. + ebf3.6dbb.7fe6.6549.0b1b.fce6.246a.9da5 :: - :: ChangedKey(uint32,bytes32,uint256) + :: ChangedKeys(uint32,bytes32,bytes32,uint32) ++ changed-key - 0xadc9.fc32.173c.d091.e0d2.ee96.60b4.b67a. - 586f.eb5a.0a30.e62c.5e9d.cfa3.573d.f8e4 + 0x6a39.f4e0.c935.b557.860d.3df3.9f1f.cb6b. + d63c.5a23.2d9e.fc28.5388.2994.f60c.708a -- --