From d33d6141991d973ca33b23aac99cd7e3995fab7c Mon Sep 17 00:00:00 2001 From: Francisco Joray Date: Mon, 29 Dec 2025 15:07:11 -0300 Subject: [PATCH 1/5] add commands to show game UTxOs --- Cargo.lock | 1 + game/Cargo.toml | 1 + game/src/game.rs | 292 ++++++++++++++++++++++++++++++++++++++++++++- game/src/lib.rs | 22 ++++ wallet/src/sync.rs | 2 +- 5 files changed, 311 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 692ce16..3deffcd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3327,6 +3327,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", + "colored", "gpc-wallet", "griffin-core", "hex", diff --git a/game/Cargo.toml b/game/Cargo.toml index b9c901d..6a00a98 100644 --- a/game/Cargo.toml +++ b/game/Cargo.toml @@ -8,6 +8,7 @@ edition.workspace = true [dependencies] anyhow = { workspace = true } clap = { features = ["derive"], workspace = true } +colored = { workspace = true } griffin-core = { workspace = true } gpc-wallet = { workspace = true } hex = { workspace = true } diff --git a/game/src/game.rs b/game/src/game.rs index dda1805..e05b846 100644 --- a/game/src/game.rs +++ b/game/src/game.rs @@ -1,5 +1,9 @@ -use crate::{CreateShipArgs, DeployScriptsArgs, GatherFuelArgs, MineAsteriaArgs, MoveShipArgs}; +use crate::{ + CreateShipArgs, DeployScriptsArgs, GatherFuelArgs, MineAsteriaArgs, MoveShipArgs, + ShowAsteriaArgs, ShowPelletsArgs, ShowShipsArgs, +}; use anyhow::anyhow; +use colored::Colorize; use gpc_wallet::{ cli::{ShowOutputsAtArgs, ShowOutputsWithAssetArgs}, keystore, sync, @@ -27,7 +31,7 @@ use griffin_core::{ uplc::tx::{apply_params_to_script, SlotConfig}, }; use jsonrpsee::{core::client::ClientT, http_client::HttpClient, rpc_params}; -use parity_scale_codec::Encode; +use parity_scale_codec::{Decode, Encode}; use sc_keystore::LocalKeystore; use serde::{Deserialize, Serialize}; use sled::Db; @@ -38,6 +42,205 @@ const ASTERIA_PARAMETERIZED: &str = "590cf90100003232323232323232323232323232223 const SPACETIME_PARAMETERIZED: &str = "592d94010000323232323232323232323232323232323232323232323223223222232232232232223253333330280021532323232323232323330283001302a37540142a660529211c52756e6e696e672032206172672076616c696461746f72206d696e740013232533302a3232323232323232325333033300c303537540102646464a66606c601e60706ea80384c8c8c94ccc0e4c048c0ecdd500089919191919299981f180c98201baa0011323232325333046001153304303e161325333047304a0021325333044301f30463754002264646464a666090604860946ea80044c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc16d4ccc16c0805288a9982e24811d6d7573745f62655f76616c69645f61737465726961203f2046616c73650014a02a6660b6a6660b6010294454cc171241206d7573745f6d696e745f65787065637465645f76616c7565203f2046616c73650014a02a6660b6a6660b600e294454cc171241216d7573745f726573706563745f6d696e5f64697374616e6365203f2046616c73650014a02a6660b6a6660b600c294454cc1712411b6d7573745f686176655f736869705f6e616d65203f2046616c73650014a02a6660b6a6660b600a294454cc1712411c6d7573745f686176655f70696c6f745f6e616d65203f2046616c73650014a02a6660b6a6660b6008294454cc1712411d6d7573745f686176655f6c61746573745f74696d65203f2046616c73650014a02a6660b6a6660b6006294454cc1712411c6d7573745f686f6c645f736869705f746f6b656e203f2046616c73650014a02a6660b6a6660b6004294454cc1712411e6d7573745f686f6c645f696e697469616c5f6675656c203f2046616c73650014a02a6660b6002294454cc17124011a6d7573745f686f6c645f335f617373657473203f2046616c73650014a029405280a5014a029405280a5014a06068664600200244a6660c0002290000981d99801001183180099198008009bab3025305e375403244a6660c0002297ae01323332223233001001003225333066001100313233068374e660d06ea4018cc1a0dd49bae30650013306837506eb4c1980052f5c06600600660d400460d00026eb8c17c004dd59830000998018019832001183100099b8733301f3756604660b86ea805c1252201044655454c0003f303433301e3756604460b66ea805809401ccdc39bad305d305e305e305e305e305a37540246eb4c174c168dd500819b8f375c60b860ba60ba60ba60b26ea8044010cdc79bae30193058375402000866e240e0c8cdc018009bad301e3058375402060026eb4c07cc160dd50081299982a99b88001480004c0cc0044004cdd79ba601f374c64646466660026666002a6660ac606490000a5eb7bdb1804c8c8cc0040052f5bded8c044a6660ba0022660bc66ec0dd48131ba60034bd6f7b630099191919299982e98049980501500109983119bb037520546e9801c01454ccc174cdc781500109983119bb037520546e9801c00c4cc188cdd81ba9002374c0026600c00c0066eacc17c00cdd7182e8011830801182f8009919800800a5eb7bdb180894ccc1700044cc174cdd81ba90074c010101004bd6f7b630099191919299982e18041980480580109983099bb037520169810101000051533305c3371e0160042660c266ec0dd4805a61010100003133061337606ea4008dd4000998030030019bad305e003375c60b800460c000460bc0020460089001023245044655454c0003c22225333059303200110041323233001001006225333060001133061337606ea4018dd3001a5eb7bdb1804c8c8c8c94ccc180c030cc0340280084cc194cdd81ba900a374c00e00a2a6660c066e3c0280084c94ccc184c0e8c18cdd500089983319bb0375201660ce60c86ea80040104010c94ccc1854ccc1940045288a5014c0103d87a80001303e33066374c00297ae03233001001002225333066001133067337606ea402cdd400525eb7bdb1804c8c8c8c94ccc198c048cc04c03c0084cc1accdd81ba900f375001c00a2a6660cc66e3c03c0084c94ccc19cc100c1a4dd500089983619bb0375202060da60d46ea80040104010c94ccc19cc1000045300103d87a8000130443306c375000297ae03370000201c2660d666ec0dd48011ba800133006006003375a60d00066eb8c198008c1a8008c1a00044cc194cdd81ba9002374c0026600c00c0066eacc18800cdd7183000118320011831000991900119198008008011129998300008a4c264a6660c200229309919299982f981c18309baa3300c375c60c260ca0086eb8c1840084cc014014cc19000800454cc1812401326b65797320696e206173736f63696174697665206c697374206172656e277420696e20617363656e64696e67206f7264657200163065002306300130630013305e337606ea4008dd4000a5eb7bdb180dd7a60103d879800022533305533720004002298103d8798000153330553371e0040022980103d87a800014c103d87b8000330024890550494c4f540030033004375a603660aa6ea804ccc005220104534849500030023003375a603460a86ea804888cdc500100091b9800123732660046ea00052201003001001222533333305700213232323232323300b0020013371491010128000025333053337100069007099b80483c80400c54ccc14ccdc4001a410004266e00cdc0241002800690068a9982a24929576861742061726520796f7520646f696e673f204e6f2049206d65616e2c20736572696f75736c792e001653330560011337149101035b5d2900004133714911035b5f2000375c60aa66600e00266ec1300102415d00375266e292210129000042233760980103422c2000375266601001000466e28dd7182b0009bae3057001375860a80046eb4c148004c8cdd81ba83052001374e60a60026ea80084c94ccc1500044cdc5245027b7d00002133714911037b5f2000375c60a664646600200200644a6660ae00220062664466ec130103422c2000375266601201260ae00466e29221023a20003330090093058002337146eb8c15c004dd7182c000982c80099801001182d00099bb04c10342207d0037520046eac0084c94ccc1500044cdc52441025b5d00002133714911035b5f2000375c60a666600a00266ec1300102415d0037520044466ec1300103422c2000375266600c00c00466e28dd7182a0009bae3055001375800426600a6eb40080044c8c8cdc524410268270000132333001001337006e3400920013371491101270000322253330533371000490000800899191919980300319b8000548004cdc599b80002533305633710004900a0a40c02903719b8b33700002a6660ac66e2000520141481805206e0043370c004901019b8300148080cdc70020011bae00222232330010010042253330540011004133003305600133002002305700122323300100100322533304e30270011337149110130000031533304e337100029000099b8a489012d0033002002302c00113300533708002900a19b8b3370066e1400520144818000cc0040048894ccc12ccdc4801240002002266600600666e1000920143371666e00cdc28012402890300008a9982481f0b180818251baa3011304a375402aa66608c603e60906ea80044c94ccc12c00454cc120110584c8c94ccc13400454cc128118584c8c94ccc13c00454cc130120584c8c94ccc14400454cc138128584c8c94ccc14c00454cc140130584c94ccc150c15c008526153305104d16325333333058001153305104d16153305104d16153305104d161375a0022a660a209a2c60aa00260aa00464a6666660ac0022a6609e0962c2a6609e0962c2a6609e0962c2a6609e0962c26eb8004c14c004c14c008c94cccccc15000454cc1341245854cc1341245854cc1341245854cc134124584dd7000982880098288011929999998290008a998258238b0a998258238b0a998258238b09bad001153304b04716304f001304f0023253333330500011533049045161533049045161533049045161375a0022a6609208a2c609a00260926ea800454cc11c10c594cccccc134004400454cc1181085854cc1181085854cc1181085854cc11810858c128c11cdd50008a99822a493165787065637420496e6c696e65446174756d28736869705f646174756d29203d20736869705f73746174652e646174756d00163007304637540022a6608807e2c6090002646600200202644a66608e002297ae0132325333045325333046302230483754002266e3c04cdd7182618249baa00114a0601c60906ea8c038c120dd50010998250011980200200089980200200098258011824800a999820180c98211baa0011325333045001153304203c16132325333047001153304403e161325333048304b002149854cc1140fc58c94cccccc13000454cc1140fc5854cc1140fc5854cc1140fc5854cc1140fc584dd7000982480098248011929999998250008a9982181e8b0a9982181e8b0a9982181e8b09bad001153304303d163047001304337540022a660820762ca66666608e00220022a660800742c2a660800742c2a660800742c2a660800742c608860826ea800454cc0fd2413e65787065637420496e6c696e65446174756d28617374657269615f646174756d29203d20617374657269615f696e7075742e6f75747075742e646174756d0016300130403754600e60806ea80108c10cc110c110004c06cccc004dd59802981f1baa3005303e37540046eb8c010c0f8dd50141bae3005303e375405044464a66607c603460806ea8004520001375a608860826ea8004c94ccc0f8c068c100dd50008a60103d87a8000132330010013756608a60846ea8008894ccc110004530103d87a8000132323253330433371e00e6eb8c11400c4c080cc120dd4000a5eb804cc014014008dd698228011824001182300099804001801181f981e1baa001153303a03116323300100100c22533303e00114c103d87a800013232533303c32533303d3016303f375400229404cdc79bae304330403754002056600a607e6ea8c014c0fcdd51803181f9baa00213019330410024bd70099802002000982100118200009181f0009181e981f000899299981d8008a9981c01a8b099299981e181f8010a99981c19b8748004dd6981d8008a51153303903616153303903616303d001325333037301330393754002297adef6c6013756607a60746ea8004cc00400800c88c8cc00400400c894ccc0f40045300103d87a80001323232533303c3371e00c6eb8c0f800c4c064cc104dd3000a5eb804cc014014008dd5981f0011820801181f800991980080080211299981d0008a5eb7bdb1804c8c8c8c94ccc0e8cdc7a44100002100313303f337606ea4008dd3000998030030019bab303c003375c6074004607c00460780026eb8c0e4c0d8dd50040a9981a24926657870656374204d696e742873686970796172645f706f6c69637929203d20707572706f7365001630383039303930390023756606e002606e606e0046eb0c0d4004c0d4c0d4008dd6181980098179baa303200230313032001302d37540182930a99815a4811856616c696461746f722072657475726e65642066616c7365001365632533302a30030011533302e302d37540042930a998158148b0a99981518030008a99981718169baa002149854cc0ac0a45854cc0ac0a458c0acdd5000a99999981800588058a998148138b0a998148138b0a998148138b0a998148138b0a99814a491d52756e6e696e672033206172672076616c696461746f72207370656e640013323232232322533302f323232323232323232323232323232323232323232325333045301e30473754002264a66608c604460906ea80584c8c94ccc120c084c128dd5000899192999825181318261baa001132323232323232323232323232325323233305a303300d1323232325333062001153305f05016132533306330660021325333060303b30623754002264646464a6660c8608060cc6ea80044c8c94ccc198c108c1a0dd50008991919192999835182198361baa001132323232323232323232323253330765333076305230263301f044230293035307a3754606c60f46ea80045288a9983ba481236d7573745f7370656e645f6f6e655f7363726970745f696e707574203f2046616c73650014a02a6660eca6660ec054294454cc1dd241206d7573745f696e636c7564655f70696c6f745f746f6b656e203f2046616c73650014a02a6660eca6660ec008294454cc1dd2411d6d7573745f686176655f656e6f7567685f6675656c203f2046616c73650014a02a6660eca6660ec00c294454cc1dd2411e6d7573745f726573706563745f6d61785f7370656564203f2046616c73650014a02a6660eca6660ec00a294454cc1dd241206d7573745f726573706563745f6c61746573745f74696d65203f2046616c73650014a02a6660eca6660ec004294454cc1dd241216d7573745f73756274726163745f6675656c5f746f6b656e73203f2046616c73650014a02a6660eca6660ec010294454cc1dd2411c6d7573745f6275726e5f7370656e745f6675656c203f2046616c73650014a02a6660eca6660ec014294454cc1dd241156d7573745f7570646174655f78203f2046616c73650014a02a6660eca6660ec012294454cc1dd241156d7573745f7570646174655f79203f2046616c73650014a02a6660eca6660ec00e294454cc1dd2411f6d7573745f7570646174655f75707065725f626f756e64203f2046616c73650014a02a6660eca6660ec016294454cc1dd241216d7573745f70726573657276655f70696c6f745f746f6b656e203f2046616c73650014a02a6660eca6660ec006294454cc1dd2411c6d7573745f686f6c645f736869705f746f6b656e203f2046616c73650014a02a6660ec002294454cc1dd24011a6d7573745f686f6c645f335f617373657473203f2046616c73650014a029405280a5014a029405280a5014a029405280a5014a0609e604460486eacc0d0c1e0dd500b99b8733301f3756606660ee6ea80581912201044655454c0033702014018609e66603c6eacc0c8c1d8dd500a81481b19b8900a008301900d32323371266e08dd6983c0011bad30783079001337046eb4c1e0004dd6983c183c801183a1baa02c3073375460ec60e66ea801ccdc39bad307530763076307630763072375401c012602a609800c66e1cdd6981618381baa00c3370006402266e1cdd6981518379baa00b3370006602266e3c0b0dd7183898391839183918371baa00a3330153756605260da6ea8c0a4c1b4dd501102d2441044655454c00153306b4915865787065637420536f6d6528737065656429203d0a20202020202020202020726174696f6e616c2e6e65772864697374616e63652c2074785f6c61746573745f74696d65202d2074785f6561726c696573745f74696d65290016330260023370200600a66e08004140c8cdc0180080698008061299983419b88001480004c1180044004dd6983618349baa001153306705c16302330683754604860d06ea80b8dd6983518339baa001153306505916302130663754604260cc6ea80b0cc0e40041594cccccc1a4004400454cc1881545854cc1881545854cc1881545854cc18815458c198c18cdd50008a998308298b180498311baa00115330600511630640013300602923375e603860c26ea8004c070c184dd5180e98309baa016375a60c460c60046eb4c184004c174dd50170a99982d181b0068991929998300008a9982e8270b09929998309832001099299982f181c98301baa0011323232325333062303b306437540022646464a6660ca608060ce6ea80044c8c8c8c94ccc1a4c114c1acdd5000899191919191919191929998392999839182698111980d820118129818983b1baa303230763754002294454cc1cd2401246d7573745f7370656e645f74776f5f7363726970745f696e70757473203f2046616c73650014a02a6660e4a6660e401e294454cc1cd2411c6d7573745f62655f76616c69645f70656c6c6574203f2046616c73650014a02a6660e4a6660e404c294454cc1cd241206d7573745f696e636c7564655f70696c6f745f746f6b656e203f2046616c73650014a02a6660e4a6660e4010294454cc1cd241216d7573745f686176655f70656c6c65745f706f736974696f6e203f2046616c73650014a02a6660e4a6660e4006294454cc1cd2411c6d7573745f6164645f6675656c5f746f6b656e73203f2046616c73650014a02a6660e4a6660e400e294454cc1cd241206d7573745f6e6f745f6578636565645f6361706163697479203f2046616c73650014a02a6660e4a6660e400a294454cc1cd241206d7573745f726573706563745f6c61746573745f74696d65203f2046616c73650014a02a6660e4a6660e400c294454cc1cd2411b6d7573745f70726573657276655f646174756d203f2046616c73650014a02a6660e4a6660e4008294454cc1cd2411c6d7573745f686f6c645f736869705f746f6b656e203f2046616c73650014a02a6660e4a6660e4004294454cc1cd2411a6d7573745f686f6c645f335f617373657473203f2046616c73650014a02a6660e4002294454cc1cd24011c6d7573745f6e6f745f6d696e745f746f6b656e73203f2046616c73650014a029405280a5014a029405280a5014a0294052819baf374c603a07698101a000304a301d301f3756605e60e66ea8050cdc399980d1bab302e307237540260be911044655454c003370000c02a60946660326eacc0b4c1c4dd5009012018980a9bad30733070375400a66ebc034110cdc499b80002011055533306a3370e0626eb4c0a0c1b4dd5002099b8702f375a605260da6ea801052819980a1bab3028306c3754605060d86ea8084165221044655454c00153306a05e163026306b3754604c60d66ea80c54ccc19cc100c1a4dd500089929998360008a9983482f8b0991929998370008a998358308b0991929998380008a998368318b0992999838983a0010a4c2a660dc0c82c64a6666660ea0022a660dc0c82c2a660dc0c82c2a660dc0c82c2a660dc0c82c26eb8004c1c8004c1c8008c94cccccc1cc00454cc1b01885854cc1b01885854cc1b0188584dd68008a998360310b183800098380011929999998388008a998350300b0a998350300b0a998350300b09bad001153306a06016306e001306a37540022a660d00bc2ca6666660dc00220022a660ce0ba2c2a660ce0ba2c2a660ce0ba2c2a660ce0ba2c60d660d06ea800454cc1992413c65787065637420496e6c696e65446174756d2870656c6c65745f646174756d29203d2070656c6c65745f696e7075742e6f75747075742e646174756d0016300e30673754604660ce6ea8008c10cccc038dd5981118331baa3022306637540026eb8c084c198dd50281bae3022306637540a060d060ca6ea800454cc18d2401ff65787065637420536f6d652870656c6c65745f696e70757429203d0a202020202020202020206c6973742e66696e64280a202020202020202020202020696e707574732c0a202020202020202020202020666e28696e70757429207b0a20202020202020202020202020207768656e20696e7075742e6f75747075742e616464726573732e7061796d656e745f63726564656e7469616c206973207b0a20202020202020202020202020202020566572696669636174696f6e4b657943726564656e7469616c285f29202d3e2046616c73650a2020202020202020202020202020202053637269707443726564656e7469616c28616464725f7061796d656e6b7429202d3e0a202020202020202020202020202020202020616464725f7061796d656e74203d3d2070656c6c65745f76616c696461746f725f616464726573730a20202020202020202020202020207d0a2020202020202020202020207d2c0a202020202020202020202900163301b02f2325333063303c3065375400229404cdc79bae3069306637540020a6604060ca6ea8c080c194dd5181098329baa00133037001054533333306700110011533060053161533060053161533060053161533060053163064306137540022a660be0a22c600e60c06ea800454cc17813c58c188004cc01009c8cdd7980d182f9baa001301a305f3754603660be6ea8050dd69830182e9baa02e1533305a303500d132533305b3034305d375400226464a6660ba607260be6ea80044c8c8c8c94ccc1854ccc184c0f0c044cc0280bc8c050c080c194dd5181098329baa00114a22a660c49201246d7573745f7370656e645f74776f5f7363726970745f696e70757473203f2046616c73650014a02a6660c2a6660c200c294454cc1892411d6d7573745f62655f76616c69645f61737465726961203f2046616c73650014a02a6660c2a6660c202a294454cc189241206d7573745f696e636c7564655f70696c6f745f746f6b656e203f2046616c73650014a02a6660c2a6660c2008294454cc189241226d7573745f686176655f617374657269615f706f736974696f6e203f2046616c73650014a02a6660c2a6660c2006294454cc1892411c6d7573745f6275726e5f736869705f746f6b656e203f2046616c73650014a02a6660c2a6660c2002294454cc1892411d6d7573745f6275726e5f6675656c5f746f6b656e73203f2046616c73650014a02a6660c2004294454cc1892401206d7573745f726573706563745f6c61746573745f74696d65203f2046616c73650014a029405280a5014a029405281803981f1998059bab301f30633754603e60c66ea80601412201044655454c003007375a60ca60c46ea800ccdc4199804980501400a010a400066ebcdd31983119bb037500486ea00892f5bded8c06e98cc1892f7b6301010000010100004bd6f7b6300a9982f0290b180d182f9baa301a305f375404a607666600c6eacc068c178dd5180d182f1baa3061305e37540026eb8c064c178dd50241bae301a305e37540902a660b80a62c66028050464a6660b8606a60bc6ea8004528099b8f375c60c460be6ea8004128c064c178dd5180c982f1baa301a305e375400226464a6660b8a6660b8607060186600a0544601e603660c06ea8c070c180dd50008a51153305d491236d7573745f7370656e645f6f6e655f7363726970745f696e707574203f2046616c73650014a02a6660b8a6660b8020294454cc175241206d7573745f696e636c7564655f70696c6f745f746f6b656e203f2046616c73650014a02a6660b8a6660b8004294454cc1752411c6d7573745f6275726e5f736869705f746f6b656e203f2046616c73650014a02a6660b8002294454cc17524011d6d7573745f6275726e5f6675656c5f746f6b656e73203f2046616c73650014a029405280a50300230393330063756603460bc6ea8c068c178dd5009825a441044655454c003371066600a600c04802003a90001b8733300430050230494881044655454c00371203044646600200200644a6660be002297ae013232533305d300500213306200233004004001133004004001306300230610012305d305e305e0012223253330593035305b37540022900009bad305f305c375400264a6660b2606a60b66ea80045300103d87a800013233001001375660c060ba6ea8008894ccc17c004530103d87a80001323232533305e3371e00e6eb8c18000c4c0eccc18cdd4000a5eb804cc014014008dd6983000118318011830800998068018011191980080080111299982d8008a5eb7bdb1804c8c8c8c94ccc16ccdc7a441000021003133060337606ea4008dd3000998030030019bab305d003375c60b600460be00460ba002600200244a6660b0002290000981999801001182d8009191980080080111299982c0008a5eb804c8ccc888c8cc00400400c894ccc178004400c4c8cc180dd3998301ba90063306037526eb8c174004cc180dd41bad305e0014bd7019801801983100118300009bae3057001375660b00026600600660b800460b4002600200244a6660aa002290000981819801001182c00092999827981418289baa300d30523754002294052898279baa021533304c3025304e37546600c03446466002002646600200264a6660a0605860a46ea800452f5bded8c026eacc158c14cdd5000998021bab300e30523754601c60a46ea800c014894ccc15000452f5c02660aa60a460ac0026600400460ae00244a6660a600229404c94ccc140cdc79bae305600201114a226600600600260ac00229445281119198008008019129998298008a60103d87a8000132323253330523371e00c6eb8c15000c4c0bccc15cdd3000a5eb804cc014014008dd5982a001182b801182a8009bae3050304d37540022a660969215d6578706563742053637269707443726564656e7469616c2873686970796172645f706f6c69637929203d0a202020202020736869705f696e7075742e6f75747075742e616464726573732e7061796d656e745f63726564656e7469616c00163007304c3754600e60986ea8c020c130dd5000982718259baa001153304949013665787065637420536f6d6528736869705f696e70757429203d2066696e645f696e70757428696e707574732c20736869705f726566290016323300201623375e600e60986ea8004008c134c128dd500b9119198008008019129998270008a60103d87a800013232533304c300500213029330510024bd70099802002000982900118280008a99823a48120657870656374205370656e6428736869705f72656629203d20707572706f73650016304b304837540022a6608c92015865787065637420536f6d65286d61785f73706565645f726174696f6e616c29203d0a202020202020726174696f6e616c2e6e6577286d61785f73706565642e64697374616e63652c206d61785f73706565642e74696d6529001633001375a6004608e6ea80c0dd6980198239baa030225333045301e00114c103d87a80001533304533710002900009811198251811198251ba830230023304a3750604600297ae04bd7009811198251811198251ba80023304a375000297ae04bd70118248009182418248009bad30463047002375c608a002608a0046eb8c10c004c10c008dd6982080098208011bad303f001303b3754020607a607c607c607c0046eacc0f0004c0f0c0f0008dd6181d000981d181d0011bac303800130343754606e004606c606e00260646ea8004526153303049011856616c696461746f722072657475726e65642066616c7365001365632533302e30070011325333033001153303002816132325333035001153303202a1613253330363039002149854cc0cc0ac58c94cccccc0e800454cc0cc0ac5854cc0cc0ac5854cc0cc0ac584dd68008a998198158b181b800981b80119299999981c0008a998188148b0a998188148b0a998188148b09bad0011533031029163035001303137540042a66605c6014002264a6660660022a660600502c264a666068606e0042930a998188148b19299999981c0008a998188148b0a998188148b0a998188148b09bad0011533031029163035001303137540042a66605c60120022a66606460626ea8008526153302f027161533302e300800115333032303137540042930a998178138b0a998178138b18179baa00153333330340011001153302d02516153302d02516153302d02516153302d025163300100202422533302b3004302d3754004264a6660600022a6605a0042c26464a6660640022a6605e0082c26464a6660680022a6606200c2c26464a66606c0022a660660102c26464a6660700022a6606a0142c264a66607260780042930a9981b0058b19299999981e8008a9981b0058b0a9981b0058b0a9981b0058b09bad001153303600b16303a001303a00232533333303b0011533034009161533034009161533034009161533034009161375c0026070002607000464a6666660720022a6606400e2c2a6606400e2c2a6606400e2c2a6606400e2c26eb8004c0d8004c0d8008c94cccccc0dc00454cc0c00145854cc0c00145854cc0c0014584dd68008a998180028b181a000981a00119299999981a8008a998170018b0a998170018b0a998170018b09bad001153302e003163032001302e37540042a660580022ca66666606001620162a660520442c2a660520442c2a660520442c2a660520442c605c60566ea8028dc3a40006e1d2006370e90021b8748008dd2a40006e052000370090011b884800054cc0840045854cc0840045854cc0840045854cc08400459240191496e636f72726563742072656465656d6572207479706520666f722076616c696461746f72207370656e642e0a2020202020202020202020202020202020202020446f75626c6520636865636b20796f7520686176652077726170706564207468652072656465656d657220747970652061732073706563696669656420696e20796f757220706c757475732e6a736f6e00375a0026eb4004dd68009bad001375c0026eb800524196657870656374205b736869705f6f75747075745d203d0a202020202020202020206c6973742e66696c746572280a2020202020202020202020206f7574707574732c0a202020202020202020202020666e286f757470757429207b206f75747075742e61646472657373203d3d20736869705f696e7075742e6f75747075742e61646472657373207d2c0a20202020202020202020290049013965787065637420496e6c696e65446174756d28736869705f6f75747075745f646174756d29203d20736869705f6f75747075742e646174756d0049013765787065637420736869705f6f75747075745f646174756d3a2053686970446174756d203d20736869705f6f75747075745f646174756d004901476578706563742046696e6974652874785f6561726c696573745f74696d6529203d2076616c69646974795f72616e67652e6c6f7765725f626f756e642e626f756e645f74797065004901456578706563742046696e6974652874785f6c61746573745f74696d6529203d2076616c69646974795f72616e67652e75707065725f626f756e642e626f756e645f747970650049012f6578706563742070656c6c65745f646174756d3a2050656c6c6574446174756d203d2070656c6c65745f646174756d004901ff65787065637420536f6d6528617374657269615f696e70757429203d0a202020202020202020206c6973742e66696e64280a202020202020202020202020696e707574732c0a202020202020202020202020666e28696e70757429207b0a20202020202020202020202020207768656e20696e7075742e6f75747075742e616464726573732e7061796d656e745f63726564656e7469616c206973207b0a20202020202020202020202020202020566572696669636174696f6e4b657943726564656e7469616c285f29202d3e2046616c73650a2020202020202020202020202020202053637269707443726564656e7469616c28616464725f7061796d656d6e7429202d3e0a202020202020202020202020202020202020616464725f7061796d656e74203d3d20617374657269615f76616c696461746f725f616464726573730a20202020202020202020202020207d0a2020202020202020202020207d2c0a20202020202020202020290049011672656465656d65723a205368697052656465656d657200490110646174756d3a2053686970446174756d0049013265787065637420617374657269615f646174756d3a2041737465726961446174756d203d20617374657269615f646174756d00490159657870656374205b736869705f73746174655d203d0a202020202020202020207472616e73616374696f6e2e66696e645f7363726970745f6f757470757473286f7574707574732c2073686970796172645f706f6c696379290049012965787065637420736869705f646174756d3a2053686970446174756d203d20736869705f646174756d00490120657870656374205b285f2c202d31295d203d206d696e7465645f746f6b656e730049011a72656465656d65723a20536869707961726452656465656d6572005734ae7155ceaab9e5573eae815d0aba257481"; const PELLET_PARAMETERIZED: &str = "590d270100003232323232323232323232323232222325333333012002153232323233300e30013010375400c2a6601e92011c52756e6e696e672032206172672076616c696461746f72206d696e7400132325333010323232323253330153008301737540082646464a666030601660346ea80284c94ccc0654ccc0654ccc064c030c06cdd5191980080080391299980f8008a60103d87a800013232533301d3013323330073756600260426ea8c004c084dd50019bae3024302137540306eb8c004c084dd500c118121812800898091981100125eb804cc010010004c08c008c0840045288a5014a22a660349201296f7074696f6e2e69735f736f6d652861646d696e5f746f6b656e5f696e70757429203f2046616c73650014a02a666032002294454cc06924011d6d7573745f6d696e745f6675656c5f746f6b656e73203f2046616c73650014a02940c038ccc00400800d2201044655454c001533301833710666002004006911044655454c00480005288a9980ca491d6d7573745f6275726e5f6675656c5f746f6b656e73203f2046616c73650014a044464a666036601e603a6ea8004520001375a6042603c6ea8004c94ccc06cc03cc074dd50008a60103d87a80001323300100137566044603e6ea8008894ccc084004530103d87a8000132323253330203371e00e6eb8c08800c4c054cc094dd4000a5eb804cc014014008dd698110011812801181180099198008008021129998100008a6103d87a80001323232533301f3371e00e6eb8c08400c4c050cc090dd3000a5eb804cc014014008dd5981080118120011811000991980080080191299980e0008a5eb7bdb1804c8c8c8c94ccc070cdc7a441000021003133021337606ea4008dd3000998030030019bab301e003375c60380046040004603c0026eb8c06cc060dd50020a9980b24922657870656374204d696e74286675656c5f706f6c69637929203d20707572706f736500163756603460366036603660360046eb0c064004c054dd5180c001180b980c00098099baa008149854cc0452411856616c696461746f722072657475726e65642066616c73650013656325333010300300115333014301337540042930a998088078b0a99980818020008a99980a18099baa002149854cc04403c5854cc04403c58c044dd5000a99999980b00388038a998078068b0a998078068b0a998078068b0a998078068b0a99807a491d52756e6e696e672033206172672076616c696461746f72207370656e64001332323223232253330153232323232533301a300e301c37540082646464a66603a6020603e6ea80044c8c8c94ccc080c050c088dd5000899191919192999812980c18139baa0131323232533302c001153302902316132533302d3030002132533302a3370e900218161baa00113232323232323253330315333031300d33016019232330010013233001001325333035302930373754002297adef6c6013756607660706ea8004cc04cdd5980b181b9baa30163037375400601c44a666072002297ae013303a3037303b00133002002303c00122533303800114a0264a66606a66e3cccdc6240006e35221045348495000375c607600491104534849500014a22660060060026076002294454cc0c924011d6d7573745f696e7075745f736869705f746f6b656e203f2046616c73650014a02a666062a666062006294454cc0c92411d6d7573745f686f6c645f61646d696e5f746f6b656e203f2046616c73650014a02a666062a666062008294454cc0c92411d6d7573745f686176655f656e6f7567685f6675656c203f2046616c73650014a02a666062a666062004294454cc0c9241206d7573745f70726f766964655f6675656c5f616d6f756e74203f2046616c73650014a02a666062002294454cc0c924011b6d7573745f70726573657276655f646174756d203f2046616c73650014a029405280a5014a066ebc014088cdc39998069bab30113032375400e01e9101044655454c003370201801460446660186eacc040c0c4dd50031bae3014303137540506eb8c040c0c4dd501419b8900800a3301d00102853333330330011001153302c02716153302c02716153302c02716153302c027163030302d37540022a660569213365787065637420496e6c696e65446174756d286f75745f646174756d29203d2070656c6c65745f6f75747075742e646174756d0016302f30303030302c37540022a660540482c605c002646600200201e44a66605a002297ae013232533302b3375e6022605c6ea8008c044c0b8dd5180698171baa00e133030002330040040011330040040013031002302f001375c6058605a605a60526ea8060dd6981598141baa0131533302530013300a00d253330263330265333026301930283754601860526ea8c030c0a4dd5180418149baa00114a02945282511301c3330043756601060526ea8c020c0a4dd50009bae300c302937540406eb8c020c0a4dd50100a5014a22a6604c921296f7074696f6e2e69735f736f6d652861646d696e5f746f6b656e5f696e70757429203f2046616c73650014a04a66604a6030604e6ea80045288a503330013756600a604c6ea8c014c098dd5003001a45044655454c00222325333026301a302837540022900009bad302c3029375400264a66604c603460506ea8004530103d87a8000132330010013756605a60546ea8008894ccc0b0004530103d87a80001323232533302b3371e00e6eb8c0b400c4c080cc0c0dd4000a5eb804cc014014008dd6981680118180011817000998020018011119198008008019129998148008a60103d87a8000132323253330283371e00c6eb8c0a800c4c074cc0b4dd3000a5eb804cc014014008dd59815001181680118158009bae3026302337540022a660429215b6578706563742053637269707443726564656e7469616c286675656c5f706f6c69637929203d0a20202020202070656c6c65745f696e7075742e6f75747075742e616464726573732e7061796d656e745f63726564656e7469616c0016300530223754600a60446ea8c004c088dd5001118129813000981198101baa001153301e49013a65787065637420536f6d652870656c6c65745f696e70757429203d2066696e645f696e70757428696e707574732c2070656c6c65745f726566290016323300200523375e600860426ea8004008c088c07cdd50031119198008008019129998118008a60103d87a8000132325333021300500213016330260024bd7009980200200098138011812800918108008a9980da48122657870656374205370656e642870656c6c65745f72656629203d20707572706f736500163758603e604060400046eb0c078004c068dd5180e801180e180e800980c1baa001149854cc0592411856616c696461746f722072657475726e65642066616c7365001365632533301430070011325333019001153301601216132533301a301d002149854cc05c04c58c94cccccc07800454cc05c04c5854cc05c04c5854cc05c04c584dd68008a9980b8098b180d800980b9baa00215333014300800115333018301737540042930a9980a8088b0a9980a8088b180a9baa001533333301a0011001153301300f16153301300f16153301300f16153301300f163300100200e225333011300430133754004264a66602c0022a660260042c26464a6660300022a6602a0082c26464a6660340022a6602e00c2c264a666036603c0042930a9980c0038b19299999980f8008a9980c0038b0a9980c0038b0a9980c0038b0a9980c0038b09bae001301c001301c00232533333301d0011533016005161533016005161533016005161375a0022a6602c00a2c6034002603400464a6666660360022a660280062c2a660280062c2a660280062c26eb400454cc05000c58c060004c050dd50010a998090008b299999980b00388038a998078060b0a998078060b0a998078060b0a998078060b180a18089baa006370e90001b8748008dd2a40006e212000153300b00116153300b00116153300b00116153300b0011649191496e636f72726563742072656465656d6572207479706520666f722076616c696461746f72207370656e642e0a2020202020202020202020202020202020202020446f75626c6520636865636b20796f7520686176652077726170706564207468652072656465656d657220747970652061732073706563696669656420696e20796f757220706c757475732e6a736f6e00490195657870656374205b70656c6c65745f6f75747075745d203d0a2020202020202020202066696c746572280a2020202020202020202020206f7574707574732c0a202020202020202020202020666e286f757470757429207b206f75747075742e61646472657373203d3d2070656c6c65745f696e7075742e6f75747075742e61646472657373207d2c0a202020202020202020202900490129657870656374206f75745f646174756d3a2050656c6c6574446174756d203d206f75745f646174756d0049011872656465656d65723a2050656c6c657452656465656d657200490112646174756d3a2050656c6c6574446174756d0049011672656465656d65723a204675656c52656465656d6572005734ae7155ceaab9e5573eae815d0aba257481"; +/// Show Asteria UTxO. +pub async fn show_asteria(db: &Db, args: ShowAsteriaArgs) -> anyhow::Result<()> { + println!("\n###### ASTERIA ###########\n"); + + let params_json: String = std::fs::read_to_string(args.params_path) + .map_err(|e| anyhow!("Failed to read params file: {}", e))?; + + let params: ScriptsParams = + serde_json::from_str(¶ms_json).map_err(|e| anyhow!("Invalid params JSON: {}", e))?; + + let asteria_script_hex: &str = + &std::fs::read_to_string(params.scripts_directory.clone() + "asteria.txt") + .map_err(|e| anyhow!("Failed to read asteria script: {}", e))?; + + let wallet_unspent_tree = db.open_tree(sync::UNSPENT)?; + for x in wallet_unspent_tree.iter() { + let (input_ivec, owner_amount_datum_ivec) = x?; + let input = hex::encode(input_ivec); + let (owner_pubkey, value, datum_option) = + <(Address, Value, Option)>::decode(&mut &owner_amount_datum_ivec[..])?; + + let asteria_script: PlutusScript = + PlutusScript(hex::decode(asteria_script_hex).expect("Failed to decode asteria script")); + let asteria_hash: PolicyId = compute_plutus_v2_script_hash(asteria_script.clone()); + let asteria_address: Address = Address( + hex::decode("70".to_owned() + &hex::encode(asteria_hash)) + .map_err(|e| anyhow!("Failed to decode asteria address: {}", e))?, + ); + + if owner_pubkey == asteria_address { + let asteria_datum = datum_option.map(|d| AsteriaDatum::from(d)); + match asteria_datum { + None | Some(AsteriaDatum::MalformedAsteriaDatum) => { + println!( + "{}: datum {:?}, value: {}", + input, + asteria_datum, + value.normalize(), + ); + } + Some(AsteriaDatum::Ok { + ship_counter, + shipyard_policy, + }) => { + println!( + "{}:\n {} {:?}\n {} {:#?}\n {} {}\n", + input.bold(), + "SHIP COUNTER:".bold(), + ship_counter, + "SHIPYARD POLICY:".bold(), + shipyard_policy, + "VALUE:".bold(), + value.normalize(), + ); + } + } + } + } + + Ok(()) +} + +/// Show pellet UTxOs. +pub async fn show_pellets(db: &Db, args: ShowPelletsArgs) -> anyhow::Result<()> { + println!("\n###### PELLETS ###########\n"); + + let params_json: String = std::fs::read_to_string(args.params_path) + .map_err(|e| anyhow!("Failed to read params file: {}", e))?; + + let params: ScriptsParams = + serde_json::from_str(¶ms_json).map_err(|e| anyhow!("Invalid params JSON: {}", e))?; + + let pellet_script_hex: &str = + &std::fs::read_to_string(params.scripts_directory.clone() + "pellet.txt") + .map_err(|e| anyhow!("Failed to read pellet script: {}", e))?; + + let wallet_unspent_tree = db.open_tree(sync::UNSPENT)?; + for x in wallet_unspent_tree.iter() { + let (input_ivec, owner_amount_datum_ivec) = x?; + let input = hex::encode(input_ivec); + let (owner_pubkey, value, datum_option) = + <(Address, Value, Option)>::decode(&mut &owner_amount_datum_ivec[..])?; + + let pellet_script: PlutusScript = + PlutusScript(hex::decode(pellet_script_hex).expect("Failed to decode pellet script")); + let pellet_hash: PolicyId = compute_plutus_v2_script_hash(pellet_script.clone()); + let pellet_address: Address = Address( + hex::decode("70".to_owned() + &hex::encode(pellet_hash)) + .map_err(|e| anyhow!("Failed to decode pellet address: {}", e))?, + ); + + if owner_pubkey == pellet_address { + let pellet_datum = datum_option.map(|d| PelletDatum::from(d)); + match pellet_datum { + None | Some(PelletDatum::MalformedPelletDatum) => { + println!( + "{}: datum {:?}, value: {}", + input, + pellet_datum, + value.normalize(), + ); + } + Some(PelletDatum::Ok { + pos_x, + pos_y, + shipyard_policy, + }) => { + println!( + "{}:\n {} {:?}\n {} {:?}\n {} {:#?}\n {} {}\n", + input.bold(), + "POS X:".bold(), + pos_x, + "POS Y:".bold(), + pos_y, + "SHIPYARD POLICY:".bold(), + shipyard_policy, + "VALUE:".bold(), + value.normalize(), + ); + } + } + } + } + + Ok(()) +} + +/// Show ship UTxOs. +pub async fn show_ships(db: &Db, args: ShowShipsArgs) -> anyhow::Result<()> { + println!("\n###### SHIPS ###########\n"); + + let params_json: String = std::fs::read_to_string(args.params_path) + .map_err(|e| anyhow!("Failed to read params file: {}", e))?; + + let params: ScriptsParams = + serde_json::from_str(¶ms_json).map_err(|e| anyhow!("Invalid params JSON: {}", e))?; + + let spacetime_script_hex: &str = + &std::fs::read_to_string(params.scripts_directory.clone() + "spacetime.txt") + .map_err(|e| anyhow!("Failed to read spacetime script: {}", e))?; + + let wallet_unspent_tree = db.open_tree(sync::UNSPENT)?; + for x in wallet_unspent_tree.iter() { + let (input_ivec, owner_amount_datum_ivec) = x?; + let input = hex::encode(input_ivec); + let (owner_pubkey, value, datum_option) = + <(Address, Value, Option)>::decode(&mut &owner_amount_datum_ivec[..])?; + + let spacetime_script: PlutusScript = PlutusScript( + hex::decode(spacetime_script_hex).expect("Failed to decode spacetime script"), + ); + let spacetime_hash: PolicyId = compute_plutus_v2_script_hash(spacetime_script.clone()); + let spacetime_address: Address = Address( + hex::decode("70".to_owned() + &hex::encode(spacetime_hash)) + .map_err(|e| anyhow!("Failed to decode spacetime address: {}", e))?, + ); + + if owner_pubkey == spacetime_address { + let ship_datum = datum_option.map(|d| ShipDatum::from(d)); + match ship_datum { + None | Some(ShipDatum::MalformedShipDatum) => { + println!( + "{}: datum {:?}, value: {}", + input, + ship_datum, + value.normalize(), + ); + } + Some(ShipDatum::Ok { + pos_x, + pos_y, + ship_token_name, + pilot_token_name, + last_move_latest_time, + }) => { + println!( + "{}:\n {} {:?}\n {} {:?}\n {} {:?}\n {} {:?}\n {} {:?}\n {} {}\n", + input.bold(), + "POS X:".bold(), + pos_x, + "POS Y:".bold(), + pos_y, + "SHIP TOKEN NAME:".bold(), + ship_token_name.0, + "PILOT TOKEN NAME:".bold(), + pilot_token_name.0, + "LAST MOVE LATEST TIME:".bold(), + last_move_latest_time, + "VALUE:".bold(), + value.normalize(), + ); + } + } + } + } + + Ok(()) +} + pub async fn create_ship( db: &Db, client: &HttpClient, @@ -1180,8 +1383,8 @@ pub enum AsteriaDatum { } impl From for Datum { - fn from(order_datum: AsteriaDatum) -> Self { - Datum(PlutusData::from(PallasPlutusData::from(order_datum)).0) + fn from(asteria_datum: AsteriaDatum) -> Self { + Datum(PlutusData::from(PallasPlutusData::from(asteria_datum)).0) } } @@ -1192,8 +1395,8 @@ impl From for AsteriaDatum { } impl From for PallasPlutusData { - fn from(order_datum: AsteriaDatum) -> Self { - match order_datum { + fn from(asteria_datum: AsteriaDatum) -> Self { + match asteria_datum { AsteriaDatum::Ok { ship_counter, shipyard_policy, @@ -1241,6 +1444,83 @@ impl From for AsteriaDatum { } } +#[derive(Debug, PartialEq, Eq, Clone)] +pub enum PelletDatum { + Ok { + pos_x: i16, + pos_y: i16, + shipyard_policy: PolicyId, + }, + MalformedPelletDatum, +} + +impl From for Datum { + fn from(pellet_datum: PelletDatum) -> Self { + Datum(PlutusData::from(PallasPlutusData::from(pellet_datum)).0) + } +} + +impl From for PelletDatum { + fn from(datum: Datum) -> Self { + <_>::from(PallasPlutusData::from(PlutusData(datum.0))) + } +} + +impl From for PallasPlutusData { + fn from(pellet_datum: PelletDatum) -> Self { + match pellet_datum { + PelletDatum::Ok { + pos_x, + pos_y, + shipyard_policy, + } => PallasPlutusData::from(PallasPlutusData::Constr(Constr { + tag: 121, + any_constructor: None, + fields: Indef( + [ + PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from( + pos_x, + )))), + PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from( + pos_y, + )))), + PallasPlutusData::BoundedBytes(BoundedBytes(shipyard_policy.0.to_vec())), + ] + .to_vec(), + ), + })), + PelletDatum::MalformedPelletDatum => { + PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from(-1)))) + } + } + } +} + +impl From for PelletDatum { + fn from(data: PallasPlutusData) -> Self { + if let PallasPlutusData::Constr(Constr { + tag: 121, + any_constructor: None, + fields: Indef(pellet_datum), + }) = data + { + if let [PallasPlutusData::BigInt(BigInt::Int(Int(pos_x))), PallasPlutusData::BigInt(BigInt::Int(Int(pos_y))), PallasPlutusData::BoundedBytes(BoundedBytes(shipyard_policy_vec))] = + &pellet_datum[..] + { + PelletDatum::Ok { + pos_x: TryFrom::::try_from(*pos_x).unwrap(), + pos_y: TryFrom::::try_from(*pos_y).unwrap(), + shipyard_policy: H224::from(PallasHash::from(shipyard_policy_vec.as_slice())), + } + } else { + PelletDatum::MalformedPelletDatum + } + } else { + PelletDatum::MalformedPelletDatum + } + } +} + #[derive(Debug, PartialEq, Eq, Clone)] pub enum ShipDatum { Ok { diff --git a/game/src/lib.rs b/game/src/lib.rs index 7a3c617..7e28c3a 100644 --- a/game/src/lib.rs +++ b/game/src/lib.rs @@ -24,6 +24,12 @@ pub enum Command { MineAsteria(MineAsteriaArgs), /// Apply parameters and write game scripts DeployScripts(DeployScriptsArgs), + /// Show Asteria UTxO + ShowAsteria(ShowAsteriaArgs), + /// Show pellet UTxOs + ShowPellets(ShowPelletsArgs), + /// Show ship UTxOs + ShowShips(ShowShipsArgs), } impl GameCommand { @@ -62,6 +68,18 @@ impl GameCommand { .unwrap(); Ok(()) } + Command::ShowAsteria(args) => { + let _ = game::show_asteria(&db, args).await.unwrap(); + Ok(()) + } + Command::ShowPellets(args) => { + let _ = game::show_pellets(&db, args).await.unwrap(); + Ok(()) + } + Command::ShowShips(args) => { + let _ = game::show_ships(&db, args).await.unwrap(); + Ok(()) + } Command::DeployScripts(args) => { let _ = game::deploy_scripts(args).await.unwrap(); Ok(()) @@ -276,3 +294,7 @@ pub struct DeployScriptsArgs { )] pub params_path: String, } + +pub type ShowAsteriaArgs = DeployScriptsArgs; +pub type ShowPelletsArgs = DeployScriptsArgs; +pub type ShowShipsArgs = DeployScriptsArgs; diff --git a/wallet/src/sync.rs b/wallet/src/sync.rs index 8b1e2df..bb3a9b7 100644 --- a/wallet/src/sync.rs +++ b/wallet/src/sync.rs @@ -38,7 +38,7 @@ const BLOCKS: &str = "blocks"; const BLOCK_HASHES: &str = "block_hashes"; /// The identifier for the unspent tree in the db. -const UNSPENT: &str = "unspent"; +pub const UNSPENT: &str = "unspent"; /// The identifier for the spent tree in the db. const SPENT: &str = "spent"; From 1682f8da48ab5f5296f81f04fe4f614ebf353c1f Mon Sep 17 00:00:00 2001 From: Francisco Joray Date: Tue, 30 Dec 2025 18:18:32 -0300 Subject: [PATCH 2/5] add methods to retrieve asset quantity and coin value from Value type --- griffin-core/src/types.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/griffin-core/src/types.rs b/griffin-core/src/types.rs index 39278e9..43d5e4b 100644 --- a/griffin-core/src/types.rs +++ b/griffin-core/src/types.rs @@ -1001,6 +1001,24 @@ impl Value { } false } + + pub fn quantity_of(&self, policy: &PolicyId, name: &AssetName) -> u64 { + if let Value::Multiasset(_, ma) = self { + if let Some(assets) = ma.0.get(policy) { + if let Some(quantity) = assets.0.get(name) { + return *quantity; + } + } + } + 0 + } + + pub fn coin_of(&self) -> u64 { + match self { + Value::Coin(c) => *c, + Value::Multiasset(c, _) => *c, + } + } } impl From for AssetName { From 88ed328dc247d6e6a84ade2d5beb54d8c8388b8f Mon Sep 17 00:00:00 2001 From: Francisco Joray Date: Tue, 30 Dec 2025 18:20:10 -0300 Subject: [PATCH 3/5] refactor: add game `types` and `queries` modules --- game/src/game.rs | 494 +------------------------------------------- game/src/lib.rs | 16 +- game/src/queries.rs | 208 +++++++++++++++++++ game/src/types.rs | 275 ++++++++++++++++++++++++ 4 files changed, 496 insertions(+), 497 deletions(-) create mode 100644 game/src/queries.rs create mode 100644 game/src/types.rs diff --git a/game/src/game.rs b/game/src/game.rs index e05b846..f0a3b3f 100644 --- a/game/src/game.rs +++ b/game/src/game.rs @@ -1,21 +1,17 @@ use crate::{ - CreateShipArgs, DeployScriptsArgs, GatherFuelArgs, MineAsteriaArgs, MoveShipArgs, - ShowAsteriaArgs, ShowPelletsArgs, ShowShipsArgs, + types::*, CreateShipArgs, DeployScriptsArgs, GatherFuelArgs, MineAsteriaArgs, MoveShipArgs, }; use anyhow::anyhow; -use colored::Colorize; use gpc_wallet::{ cli::{ShowOutputsAtArgs, ShowOutputsWithAssetArgs}, keystore, sync, }; use griffin_core::{ checks_interface::{babbage_minted_tx_from_cbor, babbage_tx_to_cbor}, - h224::H224, pallas_codec::{ minicbor, utils::{Int, MaybeIndefArray::Indef}, }, - pallas_crypto::hash::Hash as PallasHash, pallas_primitives::{ babbage::{ BigInt, BoundedBytes, Constr, MintedTx, PlutusData as PallasPlutusData, @@ -31,9 +27,8 @@ use griffin_core::{ uplc::tx::{apply_params_to_script, SlotConfig}, }; use jsonrpsee::{core::client::ClientT, http_client::HttpClient, rpc_params}; -use parity_scale_codec::{Decode, Encode}; +use parity_scale_codec::Encode; use sc_keystore::LocalKeystore; -use serde::{Deserialize, Serialize}; use sled::Db; use sp_core::ed25519::Public; use sp_runtime::traits::{BlakeTwo256, Hash}; @@ -42,205 +37,6 @@ const ASTERIA_PARAMETERIZED: &str = "590cf90100003232323232323232323232323232223 const SPACETIME_PARAMETERIZED: &str = "592d94010000323232323232323232323232323232323232323232323223223222232232232232223253333330280021532323232323232323330283001302a37540142a660529211c52756e6e696e672032206172672076616c696461746f72206d696e740013232533302a3232323232323232325333033300c303537540102646464a66606c601e60706ea80384c8c8c94ccc0e4c048c0ecdd500089919191919299981f180c98201baa0011323232325333046001153304303e161325333047304a0021325333044301f30463754002264646464a666090604860946ea80044c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc16d4ccc16c0805288a9982e24811d6d7573745f62655f76616c69645f61737465726961203f2046616c73650014a02a6660b6a6660b6010294454cc171241206d7573745f6d696e745f65787065637465645f76616c7565203f2046616c73650014a02a6660b6a6660b600e294454cc171241216d7573745f726573706563745f6d696e5f64697374616e6365203f2046616c73650014a02a6660b6a6660b600c294454cc1712411b6d7573745f686176655f736869705f6e616d65203f2046616c73650014a02a6660b6a6660b600a294454cc1712411c6d7573745f686176655f70696c6f745f6e616d65203f2046616c73650014a02a6660b6a6660b6008294454cc1712411d6d7573745f686176655f6c61746573745f74696d65203f2046616c73650014a02a6660b6a6660b6006294454cc1712411c6d7573745f686f6c645f736869705f746f6b656e203f2046616c73650014a02a6660b6a6660b6004294454cc1712411e6d7573745f686f6c645f696e697469616c5f6675656c203f2046616c73650014a02a6660b6002294454cc17124011a6d7573745f686f6c645f335f617373657473203f2046616c73650014a029405280a5014a029405280a5014a06068664600200244a6660c0002290000981d99801001183180099198008009bab3025305e375403244a6660c0002297ae01323332223233001001003225333066001100313233068374e660d06ea4018cc1a0dd49bae30650013306837506eb4c1980052f5c06600600660d400460d00026eb8c17c004dd59830000998018019832001183100099b8733301f3756604660b86ea805c1252201044655454c0003f303433301e3756604460b66ea805809401ccdc39bad305d305e305e305e305e305a37540246eb4c174c168dd500819b8f375c60b860ba60ba60ba60b26ea8044010cdc79bae30193058375402000866e240e0c8cdc018009bad301e3058375402060026eb4c07cc160dd50081299982a99b88001480004c0cc0044004cdd79ba601f374c64646466660026666002a6660ac606490000a5eb7bdb1804c8c8cc0040052f5bded8c044a6660ba0022660bc66ec0dd48131ba60034bd6f7b630099191919299982e98049980501500109983119bb037520546e9801c01454ccc174cdc781500109983119bb037520546e9801c00c4cc188cdd81ba9002374c0026600c00c0066eacc17c00cdd7182e8011830801182f8009919800800a5eb7bdb180894ccc1700044cc174cdd81ba90074c010101004bd6f7b630099191919299982e18041980480580109983099bb037520169810101000051533305c3371e0160042660c266ec0dd4805a61010100003133061337606ea4008dd4000998030030019bad305e003375c60b800460c000460bc0020460089001023245044655454c0003c22225333059303200110041323233001001006225333060001133061337606ea4018dd3001a5eb7bdb1804c8c8c8c94ccc180c030cc0340280084cc194cdd81ba900a374c00e00a2a6660c066e3c0280084c94ccc184c0e8c18cdd500089983319bb0375201660ce60c86ea80040104010c94ccc1854ccc1940045288a5014c0103d87a80001303e33066374c00297ae03233001001002225333066001133067337606ea402cdd400525eb7bdb1804c8c8c8c94ccc198c048cc04c03c0084cc1accdd81ba900f375001c00a2a6660cc66e3c03c0084c94ccc19cc100c1a4dd500089983619bb0375202060da60d46ea80040104010c94ccc19cc1000045300103d87a8000130443306c375000297ae03370000201c2660d666ec0dd48011ba800133006006003375a60d00066eb8c198008c1a8008c1a00044cc194cdd81ba9002374c0026600c00c0066eacc18800cdd7183000118320011831000991900119198008008011129998300008a4c264a6660c200229309919299982f981c18309baa3300c375c60c260ca0086eb8c1840084cc014014cc19000800454cc1812401326b65797320696e206173736f63696174697665206c697374206172656e277420696e20617363656e64696e67206f7264657200163065002306300130630013305e337606ea4008dd4000a5eb7bdb180dd7a60103d879800022533305533720004002298103d8798000153330553371e0040022980103d87a800014c103d87b8000330024890550494c4f540030033004375a603660aa6ea804ccc005220104534849500030023003375a603460a86ea804888cdc500100091b9800123732660046ea00052201003001001222533333305700213232323232323300b0020013371491010128000025333053337100069007099b80483c80400c54ccc14ccdc4001a410004266e00cdc0241002800690068a9982a24929576861742061726520796f7520646f696e673f204e6f2049206d65616e2c20736572696f75736c792e001653330560011337149101035b5d2900004133714911035b5f2000375c60aa66600e00266ec1300102415d00375266e292210129000042233760980103422c2000375266601001000466e28dd7182b0009bae3057001375860a80046eb4c148004c8cdd81ba83052001374e60a60026ea80084c94ccc1500044cdc5245027b7d00002133714911037b5f2000375c60a664646600200200644a6660ae00220062664466ec130103422c2000375266601201260ae00466e29221023a20003330090093058002337146eb8c15c004dd7182c000982c80099801001182d00099bb04c10342207d0037520046eac0084c94ccc1500044cdc52441025b5d00002133714911035b5f2000375c60a666600a00266ec1300102415d0037520044466ec1300103422c2000375266600c00c00466e28dd7182a0009bae3055001375800426600a6eb40080044c8c8cdc524410268270000132333001001337006e3400920013371491101270000322253330533371000490000800899191919980300319b8000548004cdc599b80002533305633710004900a0a40c02903719b8b33700002a6660ac66e2000520141481805206e0043370c004901019b8300148080cdc70020011bae00222232330010010042253330540011004133003305600133002002305700122323300100100322533304e30270011337149110130000031533304e337100029000099b8a489012d0033002002302c00113300533708002900a19b8b3370066e1400520144818000cc0040048894ccc12ccdc4801240002002266600600666e1000920143371666e00cdc28012402890300008a9982481f0b180818251baa3011304a375402aa66608c603e60906ea80044c94ccc12c00454cc120110584c8c94ccc13400454cc128118584c8c94ccc13c00454cc130120584c8c94ccc14400454cc138128584c8c94ccc14c00454cc140130584c94ccc150c15c008526153305104d16325333333058001153305104d16153305104d16153305104d161375a0022a660a209a2c60aa00260aa00464a6666660ac0022a6609e0962c2a6609e0962c2a6609e0962c2a6609e0962c26eb8004c14c004c14c008c94cccccc15000454cc1341245854cc1341245854cc1341245854cc134124584dd7000982880098288011929999998290008a998258238b0a998258238b0a998258238b09bad001153304b04716304f001304f0023253333330500011533049045161533049045161533049045161375a0022a6609208a2c609a00260926ea800454cc11c10c594cccccc134004400454cc1181085854cc1181085854cc1181085854cc11810858c128c11cdd50008a99822a493165787065637420496e6c696e65446174756d28736869705f646174756d29203d20736869705f73746174652e646174756d00163007304637540022a6608807e2c6090002646600200202644a66608e002297ae0132325333045325333046302230483754002266e3c04cdd7182618249baa00114a0601c60906ea8c038c120dd50010998250011980200200089980200200098258011824800a999820180c98211baa0011325333045001153304203c16132325333047001153304403e161325333048304b002149854cc1140fc58c94cccccc13000454cc1140fc5854cc1140fc5854cc1140fc5854cc1140fc584dd7000982480098248011929999998250008a9982181e8b0a9982181e8b0a9982181e8b09bad001153304303d163047001304337540022a660820762ca66666608e00220022a660800742c2a660800742c2a660800742c2a660800742c608860826ea800454cc0fd2413e65787065637420496e6c696e65446174756d28617374657269615f646174756d29203d20617374657269615f696e7075742e6f75747075742e646174756d0016300130403754600e60806ea80108c10cc110c110004c06cccc004dd59802981f1baa3005303e37540046eb8c010c0f8dd50141bae3005303e375405044464a66607c603460806ea8004520001375a608860826ea8004c94ccc0f8c068c100dd50008a60103d87a8000132330010013756608a60846ea8008894ccc110004530103d87a8000132323253330433371e00e6eb8c11400c4c080cc120dd4000a5eb804cc014014008dd698228011824001182300099804001801181f981e1baa001153303a03116323300100100c22533303e00114c103d87a800013232533303c32533303d3016303f375400229404cdc79bae304330403754002056600a607e6ea8c014c0fcdd51803181f9baa00213019330410024bd70099802002000982100118200009181f0009181e981f000899299981d8008a9981c01a8b099299981e181f8010a99981c19b8748004dd6981d8008a51153303903616153303903616303d001325333037301330393754002297adef6c6013756607a60746ea8004cc00400800c88c8cc00400400c894ccc0f40045300103d87a80001323232533303c3371e00c6eb8c0f800c4c064cc104dd3000a5eb804cc014014008dd5981f0011820801181f800991980080080211299981d0008a5eb7bdb1804c8c8c8c94ccc0e8cdc7a44100002100313303f337606ea4008dd3000998030030019bab303c003375c6074004607c00460780026eb8c0e4c0d8dd50040a9981a24926657870656374204d696e742873686970796172645f706f6c69637929203d20707572706f7365001630383039303930390023756606e002606e606e0046eb0c0d4004c0d4c0d4008dd6181980098179baa303200230313032001302d37540182930a99815a4811856616c696461746f722072657475726e65642066616c7365001365632533302a30030011533302e302d37540042930a998158148b0a99981518030008a99981718169baa002149854cc0ac0a45854cc0ac0a458c0acdd5000a99999981800588058a998148138b0a998148138b0a998148138b0a998148138b0a99814a491d52756e6e696e672033206172672076616c696461746f72207370656e640013323232232322533302f323232323232323232323232323232323232323232325333045301e30473754002264a66608c604460906ea80584c8c94ccc120c084c128dd5000899192999825181318261baa001132323232323232323232323232325323233305a303300d1323232325333062001153305f05016132533306330660021325333060303b30623754002264646464a6660c8608060cc6ea80044c8c94ccc198c108c1a0dd50008991919192999835182198361baa001132323232323232323232323253330765333076305230263301f044230293035307a3754606c60f46ea80045288a9983ba481236d7573745f7370656e645f6f6e655f7363726970745f696e707574203f2046616c73650014a02a6660eca6660ec054294454cc1dd241206d7573745f696e636c7564655f70696c6f745f746f6b656e203f2046616c73650014a02a6660eca6660ec008294454cc1dd2411d6d7573745f686176655f656e6f7567685f6675656c203f2046616c73650014a02a6660eca6660ec00c294454cc1dd2411e6d7573745f726573706563745f6d61785f7370656564203f2046616c73650014a02a6660eca6660ec00a294454cc1dd241206d7573745f726573706563745f6c61746573745f74696d65203f2046616c73650014a02a6660eca6660ec004294454cc1dd241216d7573745f73756274726163745f6675656c5f746f6b656e73203f2046616c73650014a02a6660eca6660ec010294454cc1dd2411c6d7573745f6275726e5f7370656e745f6675656c203f2046616c73650014a02a6660eca6660ec014294454cc1dd241156d7573745f7570646174655f78203f2046616c73650014a02a6660eca6660ec012294454cc1dd241156d7573745f7570646174655f79203f2046616c73650014a02a6660eca6660ec00e294454cc1dd2411f6d7573745f7570646174655f75707065725f626f756e64203f2046616c73650014a02a6660eca6660ec016294454cc1dd241216d7573745f70726573657276655f70696c6f745f746f6b656e203f2046616c73650014a02a6660eca6660ec006294454cc1dd2411c6d7573745f686f6c645f736869705f746f6b656e203f2046616c73650014a02a6660ec002294454cc1dd24011a6d7573745f686f6c645f335f617373657473203f2046616c73650014a029405280a5014a029405280a5014a029405280a5014a0609e604460486eacc0d0c1e0dd500b99b8733301f3756606660ee6ea80581912201044655454c0033702014018609e66603c6eacc0c8c1d8dd500a81481b19b8900a008301900d32323371266e08dd6983c0011bad30783079001337046eb4c1e0004dd6983c183c801183a1baa02c3073375460ec60e66ea801ccdc39bad307530763076307630763072375401c012602a609800c66e1cdd6981618381baa00c3370006402266e1cdd6981518379baa00b3370006602266e3c0b0dd7183898391839183918371baa00a3330153756605260da6ea8c0a4c1b4dd501102d2441044655454c00153306b4915865787065637420536f6d6528737065656429203d0a20202020202020202020726174696f6e616c2e6e65772864697374616e63652c2074785f6c61746573745f74696d65202d2074785f6561726c696573745f74696d65290016330260023370200600a66e08004140c8cdc0180080698008061299983419b88001480004c1180044004dd6983618349baa001153306705c16302330683754604860d06ea80b8dd6983518339baa001153306505916302130663754604260cc6ea80b0cc0e40041594cccccc1a4004400454cc1881545854cc1881545854cc1881545854cc18815458c198c18cdd50008a998308298b180498311baa00115330600511630640013300602923375e603860c26ea8004c070c184dd5180e98309baa016375a60c460c60046eb4c184004c174dd50170a99982d181b0068991929998300008a9982e8270b09929998309832001099299982f181c98301baa0011323232325333062303b306437540022646464a6660ca608060ce6ea80044c8c8c8c94ccc1a4c114c1acdd5000899191919191919191929998392999839182698111980d820118129818983b1baa303230763754002294454cc1cd2401246d7573745f7370656e645f74776f5f7363726970745f696e70757473203f2046616c73650014a02a6660e4a6660e401e294454cc1cd2411c6d7573745f62655f76616c69645f70656c6c6574203f2046616c73650014a02a6660e4a6660e404c294454cc1cd241206d7573745f696e636c7564655f70696c6f745f746f6b656e203f2046616c73650014a02a6660e4a6660e4010294454cc1cd241216d7573745f686176655f70656c6c65745f706f736974696f6e203f2046616c73650014a02a6660e4a6660e4006294454cc1cd2411c6d7573745f6164645f6675656c5f746f6b656e73203f2046616c73650014a02a6660e4a6660e400e294454cc1cd241206d7573745f6e6f745f6578636565645f6361706163697479203f2046616c73650014a02a6660e4a6660e400a294454cc1cd241206d7573745f726573706563745f6c61746573745f74696d65203f2046616c73650014a02a6660e4a6660e400c294454cc1cd2411b6d7573745f70726573657276655f646174756d203f2046616c73650014a02a6660e4a6660e4008294454cc1cd2411c6d7573745f686f6c645f736869705f746f6b656e203f2046616c73650014a02a6660e4a6660e4004294454cc1cd2411a6d7573745f686f6c645f335f617373657473203f2046616c73650014a02a6660e4002294454cc1cd24011c6d7573745f6e6f745f6d696e745f746f6b656e73203f2046616c73650014a029405280a5014a029405280a5014a0294052819baf374c603a07698101a000304a301d301f3756605e60e66ea8050cdc399980d1bab302e307237540260be911044655454c003370000c02a60946660326eacc0b4c1c4dd5009012018980a9bad30733070375400a66ebc034110cdc499b80002011055533306a3370e0626eb4c0a0c1b4dd5002099b8702f375a605260da6ea801052819980a1bab3028306c3754605060d86ea8084165221044655454c00153306a05e163026306b3754604c60d66ea80c54ccc19cc100c1a4dd500089929998360008a9983482f8b0991929998370008a998358308b0991929998380008a998368318b0992999838983a0010a4c2a660dc0c82c64a6666660ea0022a660dc0c82c2a660dc0c82c2a660dc0c82c2a660dc0c82c26eb8004c1c8004c1c8008c94cccccc1cc00454cc1b01885854cc1b01885854cc1b0188584dd68008a998360310b183800098380011929999998388008a998350300b0a998350300b0a998350300b09bad001153306a06016306e001306a37540022a660d00bc2ca6666660dc00220022a660ce0ba2c2a660ce0ba2c2a660ce0ba2c2a660ce0ba2c60d660d06ea800454cc1992413c65787065637420496e6c696e65446174756d2870656c6c65745f646174756d29203d2070656c6c65745f696e7075742e6f75747075742e646174756d0016300e30673754604660ce6ea8008c10cccc038dd5981118331baa3022306637540026eb8c084c198dd50281bae3022306637540a060d060ca6ea800454cc18d2401ff65787065637420536f6d652870656c6c65745f696e70757429203d0a202020202020202020206c6973742e66696e64280a202020202020202020202020696e707574732c0a202020202020202020202020666e28696e70757429207b0a20202020202020202020202020207768656e20696e7075742e6f75747075742e616464726573732e7061796d656e745f63726564656e7469616c206973207b0a20202020202020202020202020202020566572696669636174696f6e4b657943726564656e7469616c285f29202d3e2046616c73650a2020202020202020202020202020202053637269707443726564656e7469616c28616464725f7061796d656e6b7429202d3e0a202020202020202020202020202020202020616464725f7061796d656e74203d3d2070656c6c65745f76616c696461746f725f616464726573730a20202020202020202020202020207d0a2020202020202020202020207d2c0a202020202020202020202900163301b02f2325333063303c3065375400229404cdc79bae3069306637540020a6604060ca6ea8c080c194dd5181098329baa00133037001054533333306700110011533060053161533060053161533060053161533060053163064306137540022a660be0a22c600e60c06ea800454cc17813c58c188004cc01009c8cdd7980d182f9baa001301a305f3754603660be6ea8050dd69830182e9baa02e1533305a303500d132533305b3034305d375400226464a6660ba607260be6ea80044c8c8c8c94ccc1854ccc184c0f0c044cc0280bc8c050c080c194dd5181098329baa00114a22a660c49201246d7573745f7370656e645f74776f5f7363726970745f696e70757473203f2046616c73650014a02a6660c2a6660c200c294454cc1892411d6d7573745f62655f76616c69645f61737465726961203f2046616c73650014a02a6660c2a6660c202a294454cc189241206d7573745f696e636c7564655f70696c6f745f746f6b656e203f2046616c73650014a02a6660c2a6660c2008294454cc189241226d7573745f686176655f617374657269615f706f736974696f6e203f2046616c73650014a02a6660c2a6660c2006294454cc1892411c6d7573745f6275726e5f736869705f746f6b656e203f2046616c73650014a02a6660c2a6660c2002294454cc1892411d6d7573745f6275726e5f6675656c5f746f6b656e73203f2046616c73650014a02a6660c2004294454cc1892401206d7573745f726573706563745f6c61746573745f74696d65203f2046616c73650014a029405280a5014a029405281803981f1998059bab301f30633754603e60c66ea80601412201044655454c003007375a60ca60c46ea800ccdc4199804980501400a010a400066ebcdd31983119bb037500486ea00892f5bded8c06e98cc1892f7b6301010000010100004bd6f7b6300a9982f0290b180d182f9baa301a305f375404a607666600c6eacc068c178dd5180d182f1baa3061305e37540026eb8c064c178dd50241bae301a305e37540902a660b80a62c66028050464a6660b8606a60bc6ea8004528099b8f375c60c460be6ea8004128c064c178dd5180c982f1baa301a305e375400226464a6660b8a6660b8607060186600a0544601e603660c06ea8c070c180dd50008a51153305d491236d7573745f7370656e645f6f6e655f7363726970745f696e707574203f2046616c73650014a02a6660b8a6660b8020294454cc175241206d7573745f696e636c7564655f70696c6f745f746f6b656e203f2046616c73650014a02a6660b8a6660b8004294454cc1752411c6d7573745f6275726e5f736869705f746f6b656e203f2046616c73650014a02a6660b8002294454cc17524011d6d7573745f6275726e5f6675656c5f746f6b656e73203f2046616c73650014a029405280a50300230393330063756603460bc6ea8c068c178dd5009825a441044655454c003371066600a600c04802003a90001b8733300430050230494881044655454c00371203044646600200200644a6660be002297ae013232533305d300500213306200233004004001133004004001306300230610012305d305e305e0012223253330593035305b37540022900009bad305f305c375400264a6660b2606a60b66ea80045300103d87a800013233001001375660c060ba6ea8008894ccc17c004530103d87a80001323232533305e3371e00e6eb8c18000c4c0eccc18cdd4000a5eb804cc014014008dd6983000118318011830800998068018011191980080080111299982d8008a5eb7bdb1804c8c8c8c94ccc16ccdc7a441000021003133060337606ea4008dd3000998030030019bab305d003375c60b600460be00460ba002600200244a6660b0002290000981999801001182d8009191980080080111299982c0008a5eb804c8ccc888c8cc00400400c894ccc178004400c4c8cc180dd3998301ba90063306037526eb8c174004cc180dd41bad305e0014bd7019801801983100118300009bae3057001375660b00026600600660b800460b4002600200244a6660aa002290000981819801001182c00092999827981418289baa300d30523754002294052898279baa021533304c3025304e37546600c03446466002002646600200264a6660a0605860a46ea800452f5bded8c026eacc158c14cdd5000998021bab300e30523754601c60a46ea800c014894ccc15000452f5c02660aa60a460ac0026600400460ae00244a6660a600229404c94ccc140cdc79bae305600201114a226600600600260ac00229445281119198008008019129998298008a60103d87a8000132323253330523371e00c6eb8c15000c4c0bccc15cdd3000a5eb804cc014014008dd5982a001182b801182a8009bae3050304d37540022a660969215d6578706563742053637269707443726564656e7469616c2873686970796172645f706f6c69637929203d0a202020202020736869705f696e7075742e6f75747075742e616464726573732e7061796d656e745f63726564656e7469616c00163007304c3754600e60986ea8c020c130dd5000982718259baa001153304949013665787065637420536f6d6528736869705f696e70757429203d2066696e645f696e70757428696e707574732c20736869705f726566290016323300201623375e600e60986ea8004008c134c128dd500b9119198008008019129998270008a60103d87a800013232533304c300500213029330510024bd70099802002000982900118280008a99823a48120657870656374205370656e6428736869705f72656629203d20707572706f73650016304b304837540022a6608c92015865787065637420536f6d65286d61785f73706565645f726174696f6e616c29203d0a202020202020726174696f6e616c2e6e6577286d61785f73706565642e64697374616e63652c206d61785f73706565642e74696d6529001633001375a6004608e6ea80c0dd6980198239baa030225333045301e00114c103d87a80001533304533710002900009811198251811198251ba830230023304a3750604600297ae04bd7009811198251811198251ba80023304a375000297ae04bd70118248009182418248009bad30463047002375c608a002608a0046eb8c10c004c10c008dd6982080098208011bad303f001303b3754020607a607c607c607c0046eacc0f0004c0f0c0f0008dd6181d000981d181d0011bac303800130343754606e004606c606e00260646ea8004526153303049011856616c696461746f722072657475726e65642066616c7365001365632533302e30070011325333033001153303002816132325333035001153303202a1613253330363039002149854cc0cc0ac58c94cccccc0e800454cc0cc0ac5854cc0cc0ac5854cc0cc0ac584dd68008a998198158b181b800981b80119299999981c0008a998188148b0a998188148b0a998188148b09bad0011533031029163035001303137540042a66605c6014002264a6660660022a660600502c264a666068606e0042930a998188148b19299999981c0008a998188148b0a998188148b0a998188148b09bad0011533031029163035001303137540042a66605c60120022a66606460626ea8008526153302f027161533302e300800115333032303137540042930a998178138b0a998178138b18179baa00153333330340011001153302d02516153302d02516153302d02516153302d025163300100202422533302b3004302d3754004264a6660600022a6605a0042c26464a6660640022a6605e0082c26464a6660680022a6606200c2c26464a66606c0022a660660102c26464a6660700022a6606a0142c264a66607260780042930a9981b0058b19299999981e8008a9981b0058b0a9981b0058b0a9981b0058b09bad001153303600b16303a001303a00232533333303b0011533034009161533034009161533034009161533034009161375c0026070002607000464a6666660720022a6606400e2c2a6606400e2c2a6606400e2c2a6606400e2c26eb8004c0d8004c0d8008c94cccccc0dc00454cc0c00145854cc0c00145854cc0c0014584dd68008a998180028b181a000981a00119299999981a8008a998170018b0a998170018b0a998170018b09bad001153302e003163032001302e37540042a660580022ca66666606001620162a660520442c2a660520442c2a660520442c2a660520442c605c60566ea8028dc3a40006e1d2006370e90021b8748008dd2a40006e052000370090011b884800054cc0840045854cc0840045854cc0840045854cc08400459240191496e636f72726563742072656465656d6572207479706520666f722076616c696461746f72207370656e642e0a2020202020202020202020202020202020202020446f75626c6520636865636b20796f7520686176652077726170706564207468652072656465656d657220747970652061732073706563696669656420696e20796f757220706c757475732e6a736f6e00375a0026eb4004dd68009bad001375c0026eb800524196657870656374205b736869705f6f75747075745d203d0a202020202020202020206c6973742e66696c746572280a2020202020202020202020206f7574707574732c0a202020202020202020202020666e286f757470757429207b206f75747075742e61646472657373203d3d20736869705f696e7075742e6f75747075742e61646472657373207d2c0a20202020202020202020290049013965787065637420496e6c696e65446174756d28736869705f6f75747075745f646174756d29203d20736869705f6f75747075742e646174756d0049013765787065637420736869705f6f75747075745f646174756d3a2053686970446174756d203d20736869705f6f75747075745f646174756d004901476578706563742046696e6974652874785f6561726c696573745f74696d6529203d2076616c69646974795f72616e67652e6c6f7765725f626f756e642e626f756e645f74797065004901456578706563742046696e6974652874785f6c61746573745f74696d6529203d2076616c69646974795f72616e67652e75707065725f626f756e642e626f756e645f747970650049012f6578706563742070656c6c65745f646174756d3a2050656c6c6574446174756d203d2070656c6c65745f646174756d004901ff65787065637420536f6d6528617374657269615f696e70757429203d0a202020202020202020206c6973742e66696e64280a202020202020202020202020696e707574732c0a202020202020202020202020666e28696e70757429207b0a20202020202020202020202020207768656e20696e7075742e6f75747075742e616464726573732e7061796d656e745f63726564656e7469616c206973207b0a20202020202020202020202020202020566572696669636174696f6e4b657943726564656e7469616c285f29202d3e2046616c73650a2020202020202020202020202020202053637269707443726564656e7469616c28616464725f7061796d656d6e7429202d3e0a202020202020202020202020202020202020616464725f7061796d656e74203d3d20617374657269615f76616c696461746f725f616464726573730a20202020202020202020202020207d0a2020202020202020202020207d2c0a20202020202020202020290049011672656465656d65723a205368697052656465656d657200490110646174756d3a2053686970446174756d0049013265787065637420617374657269615f646174756d3a2041737465726961446174756d203d20617374657269615f646174756d00490159657870656374205b736869705f73746174655d203d0a202020202020202020207472616e73616374696f6e2e66696e645f7363726970745f6f757470757473286f7574707574732c2073686970796172645f706f6c696379290049012965787065637420736869705f646174756d3a2053686970446174756d203d20736869705f646174756d00490120657870656374205b285f2c202d31295d203d206d696e7465645f746f6b656e730049011a72656465656d65723a20536869707961726452656465656d6572005734ae7155ceaab9e5573eae815d0aba257481"; const PELLET_PARAMETERIZED: &str = "590d270100003232323232323232323232323232222325333333012002153232323233300e30013010375400c2a6601e92011c52756e6e696e672032206172672076616c696461746f72206d696e7400132325333010323232323253330153008301737540082646464a666030601660346ea80284c94ccc0654ccc0654ccc064c030c06cdd5191980080080391299980f8008a60103d87a800013232533301d3013323330073756600260426ea8c004c084dd50019bae3024302137540306eb8c004c084dd500c118121812800898091981100125eb804cc010010004c08c008c0840045288a5014a22a660349201296f7074696f6e2e69735f736f6d652861646d696e5f746f6b656e5f696e70757429203f2046616c73650014a02a666032002294454cc06924011d6d7573745f6d696e745f6675656c5f746f6b656e73203f2046616c73650014a02940c038ccc00400800d2201044655454c001533301833710666002004006911044655454c00480005288a9980ca491d6d7573745f6275726e5f6675656c5f746f6b656e73203f2046616c73650014a044464a666036601e603a6ea8004520001375a6042603c6ea8004c94ccc06cc03cc074dd50008a60103d87a80001323300100137566044603e6ea8008894ccc084004530103d87a8000132323253330203371e00e6eb8c08800c4c054cc094dd4000a5eb804cc014014008dd698110011812801181180099198008008021129998100008a6103d87a80001323232533301f3371e00e6eb8c08400c4c050cc090dd3000a5eb804cc014014008dd5981080118120011811000991980080080191299980e0008a5eb7bdb1804c8c8c8c94ccc070cdc7a441000021003133021337606ea4008dd3000998030030019bab301e003375c60380046040004603c0026eb8c06cc060dd50020a9980b24922657870656374204d696e74286675656c5f706f6c69637929203d20707572706f736500163756603460366036603660360046eb0c064004c054dd5180c001180b980c00098099baa008149854cc0452411856616c696461746f722072657475726e65642066616c73650013656325333010300300115333014301337540042930a998088078b0a99980818020008a99980a18099baa002149854cc04403c5854cc04403c58c044dd5000a99999980b00388038a998078068b0a998078068b0a998078068b0a998078068b0a99807a491d52756e6e696e672033206172672076616c696461746f72207370656e64001332323223232253330153232323232533301a300e301c37540082646464a66603a6020603e6ea80044c8c8c94ccc080c050c088dd5000899191919192999812980c18139baa0131323232533302c001153302902316132533302d3030002132533302a3370e900218161baa00113232323232323253330315333031300d33016019232330010013233001001325333035302930373754002297adef6c6013756607660706ea8004cc04cdd5980b181b9baa30163037375400601c44a666072002297ae013303a3037303b00133002002303c00122533303800114a0264a66606a66e3cccdc6240006e35221045348495000375c607600491104534849500014a22660060060026076002294454cc0c924011d6d7573745f696e7075745f736869705f746f6b656e203f2046616c73650014a02a666062a666062006294454cc0c92411d6d7573745f686f6c645f61646d696e5f746f6b656e203f2046616c73650014a02a666062a666062008294454cc0c92411d6d7573745f686176655f656e6f7567685f6675656c203f2046616c73650014a02a666062a666062004294454cc0c9241206d7573745f70726f766964655f6675656c5f616d6f756e74203f2046616c73650014a02a666062002294454cc0c924011b6d7573745f70726573657276655f646174756d203f2046616c73650014a029405280a5014a066ebc014088cdc39998069bab30113032375400e01e9101044655454c003370201801460446660186eacc040c0c4dd50031bae3014303137540506eb8c040c0c4dd501419b8900800a3301d00102853333330330011001153302c02716153302c02716153302c02716153302c027163030302d37540022a660569213365787065637420496e6c696e65446174756d286f75745f646174756d29203d2070656c6c65745f6f75747075742e646174756d0016302f30303030302c37540022a660540482c605c002646600200201e44a66605a002297ae013232533302b3375e6022605c6ea8008c044c0b8dd5180698171baa00e133030002330040040011330040040013031002302f001375c6058605a605a60526ea8060dd6981598141baa0131533302530013300a00d253330263330265333026301930283754601860526ea8c030c0a4dd5180418149baa00114a02945282511301c3330043756601060526ea8c020c0a4dd50009bae300c302937540406eb8c020c0a4dd50100a5014a22a6604c921296f7074696f6e2e69735f736f6d652861646d696e5f746f6b656e5f696e70757429203f2046616c73650014a04a66604a6030604e6ea80045288a503330013756600a604c6ea8c014c098dd5003001a45044655454c00222325333026301a302837540022900009bad302c3029375400264a66604c603460506ea8004530103d87a8000132330010013756605a60546ea8008894ccc0b0004530103d87a80001323232533302b3371e00e6eb8c0b400c4c080cc0c0dd4000a5eb804cc014014008dd6981680118180011817000998020018011119198008008019129998148008a60103d87a8000132323253330283371e00c6eb8c0a800c4c074cc0b4dd3000a5eb804cc014014008dd59815001181680118158009bae3026302337540022a660429215b6578706563742053637269707443726564656e7469616c286675656c5f706f6c69637929203d0a20202020202070656c6c65745f696e7075742e6f75747075742e616464726573732e7061796d656e745f63726564656e7469616c0016300530223754600a60446ea8c004c088dd5001118129813000981198101baa001153301e49013a65787065637420536f6d652870656c6c65745f696e70757429203d2066696e645f696e70757428696e707574732c2070656c6c65745f726566290016323300200523375e600860426ea8004008c088c07cdd50031119198008008019129998118008a60103d87a8000132325333021300500213016330260024bd7009980200200098138011812800918108008a9980da48122657870656374205370656e642870656c6c65745f72656629203d20707572706f736500163758603e604060400046eb0c078004c068dd5180e801180e180e800980c1baa001149854cc0592411856616c696461746f722072657475726e65642066616c7365001365632533301430070011325333019001153301601216132533301a301d002149854cc05c04c58c94cccccc07800454cc05c04c5854cc05c04c5854cc05c04c584dd68008a9980b8098b180d800980b9baa00215333014300800115333018301737540042930a9980a8088b0a9980a8088b180a9baa001533333301a0011001153301300f16153301300f16153301300f16153301300f163300100200e225333011300430133754004264a66602c0022a660260042c26464a6660300022a6602a0082c26464a6660340022a6602e00c2c264a666036603c0042930a9980c0038b19299999980f8008a9980c0038b0a9980c0038b0a9980c0038b0a9980c0038b09bae001301c001301c00232533333301d0011533016005161533016005161533016005161375a0022a6602c00a2c6034002603400464a6666660360022a660280062c2a660280062c2a660280062c26eb400454cc05000c58c060004c050dd50010a998090008b299999980b00388038a998078060b0a998078060b0a998078060b0a998078060b180a18089baa006370e90001b8748008dd2a40006e212000153300b00116153300b00116153300b00116153300b0011649191496e636f72726563742072656465656d6572207479706520666f722076616c696461746f72207370656e642e0a2020202020202020202020202020202020202020446f75626c6520636865636b20796f7520686176652077726170706564207468652072656465656d657220747970652061732073706563696669656420696e20796f757220706c757475732e6a736f6e00490195657870656374205b70656c6c65745f6f75747075745d203d0a2020202020202020202066696c746572280a2020202020202020202020206f7574707574732c0a202020202020202020202020666e286f757470757429207b206f75747075742e61646472657373203d3d2070656c6c65745f696e7075742e6f75747075742e61646472657373207d2c0a202020202020202020202900490129657870656374206f75745f646174756d3a2050656c6c6574446174756d203d206f75745f646174756d0049011872656465656d65723a2050656c6c657452656465656d657200490112646174756d3a2050656c6c6574446174756d0049011672656465656d65723a204675656c52656465656d6572005734ae7155ceaab9e5573eae815d0aba257481"; -/// Show Asteria UTxO. -pub async fn show_asteria(db: &Db, args: ShowAsteriaArgs) -> anyhow::Result<()> { - println!("\n###### ASTERIA ###########\n"); - - let params_json: String = std::fs::read_to_string(args.params_path) - .map_err(|e| anyhow!("Failed to read params file: {}", e))?; - - let params: ScriptsParams = - serde_json::from_str(¶ms_json).map_err(|e| anyhow!("Invalid params JSON: {}", e))?; - - let asteria_script_hex: &str = - &std::fs::read_to_string(params.scripts_directory.clone() + "asteria.txt") - .map_err(|e| anyhow!("Failed to read asteria script: {}", e))?; - - let wallet_unspent_tree = db.open_tree(sync::UNSPENT)?; - for x in wallet_unspent_tree.iter() { - let (input_ivec, owner_amount_datum_ivec) = x?; - let input = hex::encode(input_ivec); - let (owner_pubkey, value, datum_option) = - <(Address, Value, Option)>::decode(&mut &owner_amount_datum_ivec[..])?; - - let asteria_script: PlutusScript = - PlutusScript(hex::decode(asteria_script_hex).expect("Failed to decode asteria script")); - let asteria_hash: PolicyId = compute_plutus_v2_script_hash(asteria_script.clone()); - let asteria_address: Address = Address( - hex::decode("70".to_owned() + &hex::encode(asteria_hash)) - .map_err(|e| anyhow!("Failed to decode asteria address: {}", e))?, - ); - - if owner_pubkey == asteria_address { - let asteria_datum = datum_option.map(|d| AsteriaDatum::from(d)); - match asteria_datum { - None | Some(AsteriaDatum::MalformedAsteriaDatum) => { - println!( - "{}: datum {:?}, value: {}", - input, - asteria_datum, - value.normalize(), - ); - } - Some(AsteriaDatum::Ok { - ship_counter, - shipyard_policy, - }) => { - println!( - "{}:\n {} {:?}\n {} {:#?}\n {} {}\n", - input.bold(), - "SHIP COUNTER:".bold(), - ship_counter, - "SHIPYARD POLICY:".bold(), - shipyard_policy, - "VALUE:".bold(), - value.normalize(), - ); - } - } - } - } - - Ok(()) -} - -/// Show pellet UTxOs. -pub async fn show_pellets(db: &Db, args: ShowPelletsArgs) -> anyhow::Result<()> { - println!("\n###### PELLETS ###########\n"); - - let params_json: String = std::fs::read_to_string(args.params_path) - .map_err(|e| anyhow!("Failed to read params file: {}", e))?; - - let params: ScriptsParams = - serde_json::from_str(¶ms_json).map_err(|e| anyhow!("Invalid params JSON: {}", e))?; - - let pellet_script_hex: &str = - &std::fs::read_to_string(params.scripts_directory.clone() + "pellet.txt") - .map_err(|e| anyhow!("Failed to read pellet script: {}", e))?; - - let wallet_unspent_tree = db.open_tree(sync::UNSPENT)?; - for x in wallet_unspent_tree.iter() { - let (input_ivec, owner_amount_datum_ivec) = x?; - let input = hex::encode(input_ivec); - let (owner_pubkey, value, datum_option) = - <(Address, Value, Option)>::decode(&mut &owner_amount_datum_ivec[..])?; - - let pellet_script: PlutusScript = - PlutusScript(hex::decode(pellet_script_hex).expect("Failed to decode pellet script")); - let pellet_hash: PolicyId = compute_plutus_v2_script_hash(pellet_script.clone()); - let pellet_address: Address = Address( - hex::decode("70".to_owned() + &hex::encode(pellet_hash)) - .map_err(|e| anyhow!("Failed to decode pellet address: {}", e))?, - ); - - if owner_pubkey == pellet_address { - let pellet_datum = datum_option.map(|d| PelletDatum::from(d)); - match pellet_datum { - None | Some(PelletDatum::MalformedPelletDatum) => { - println!( - "{}: datum {:?}, value: {}", - input, - pellet_datum, - value.normalize(), - ); - } - Some(PelletDatum::Ok { - pos_x, - pos_y, - shipyard_policy, - }) => { - println!( - "{}:\n {} {:?}\n {} {:?}\n {} {:#?}\n {} {}\n", - input.bold(), - "POS X:".bold(), - pos_x, - "POS Y:".bold(), - pos_y, - "SHIPYARD POLICY:".bold(), - shipyard_policy, - "VALUE:".bold(), - value.normalize(), - ); - } - } - } - } - - Ok(()) -} - -/// Show ship UTxOs. -pub async fn show_ships(db: &Db, args: ShowShipsArgs) -> anyhow::Result<()> { - println!("\n###### SHIPS ###########\n"); - - let params_json: String = std::fs::read_to_string(args.params_path) - .map_err(|e| anyhow!("Failed to read params file: {}", e))?; - - let params: ScriptsParams = - serde_json::from_str(¶ms_json).map_err(|e| anyhow!("Invalid params JSON: {}", e))?; - - let spacetime_script_hex: &str = - &std::fs::read_to_string(params.scripts_directory.clone() + "spacetime.txt") - .map_err(|e| anyhow!("Failed to read spacetime script: {}", e))?; - - let wallet_unspent_tree = db.open_tree(sync::UNSPENT)?; - for x in wallet_unspent_tree.iter() { - let (input_ivec, owner_amount_datum_ivec) = x?; - let input = hex::encode(input_ivec); - let (owner_pubkey, value, datum_option) = - <(Address, Value, Option)>::decode(&mut &owner_amount_datum_ivec[..])?; - - let spacetime_script: PlutusScript = PlutusScript( - hex::decode(spacetime_script_hex).expect("Failed to decode spacetime script"), - ); - let spacetime_hash: PolicyId = compute_plutus_v2_script_hash(spacetime_script.clone()); - let spacetime_address: Address = Address( - hex::decode("70".to_owned() + &hex::encode(spacetime_hash)) - .map_err(|e| anyhow!("Failed to decode spacetime address: {}", e))?, - ); - - if owner_pubkey == spacetime_address { - let ship_datum = datum_option.map(|d| ShipDatum::from(d)); - match ship_datum { - None | Some(ShipDatum::MalformedShipDatum) => { - println!( - "{}: datum {:?}, value: {}", - input, - ship_datum, - value.normalize(), - ); - } - Some(ShipDatum::Ok { - pos_x, - pos_y, - ship_token_name, - pilot_token_name, - last_move_latest_time, - }) => { - println!( - "{}:\n {} {:?}\n {} {:?}\n {} {:?}\n {} {:?}\n {} {:?}\n {} {}\n", - input.bold(), - "POS X:".bold(), - pos_x, - "POS Y:".bold(), - pos_y, - "SHIP TOKEN NAME:".bold(), - ship_token_name.0, - "PILOT TOKEN NAME:".bold(), - pilot_token_name.0, - "LAST MOVE LATEST TIME:".bold(), - last_move_latest_time, - "VALUE:".bold(), - value.normalize(), - ); - } - } - } - } - - Ok(()) -} - pub async fn create_ship( db: &Db, client: &HttpClient, @@ -1039,7 +835,7 @@ pub async fn mine_asteria( transaction.transaction_body.inputs = inputs; // BURNS - let ship_fuel = quanity_of(&ship_value, &pellet_policy, &fuel_name); + let ship_fuel = (&ship_value).quantity_of(&pellet_policy, &fuel_name); let ship_fuel_i64: i64 = ship_fuel .try_into() .expect("Fuel amount too large to fit in i64"); @@ -1104,7 +900,7 @@ pub async fn mine_asteria( address: pilot_utxo.address.clone(), value: pilot_utxo.value.clone() + Value::Coin(args.mine_coin_amount) - + Value::Coin(coin_of(&ship_value)), + + Value::Coin((&ship_value).coin_of()), datum_option: pilot_utxo.datum_option.clone(), }, Output { @@ -1334,285 +1130,3 @@ pub async fn deploy_scripts(args: DeployScriptsArgs) -> anyhow::Result<()> { println!("All scripts written successfully!"); Ok(()) } - -fn quanity_of(value: &Value, policy: &PolicyId, name: &AssetName) -> u64 { - if let Value::Multiasset(_, ma) = value { - if let Some(assets) = ma.0.get(policy) { - if let Some(quantity) = assets.0.get(name) { - return *quantity as u64; - } - } - } - 0 -} - -fn coin_of(value: &Value) -> u64 { - match value { - Value::Coin(c) => *c, - Value::Multiasset(c, _) => *c, - } -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -struct ScriptsParams { - admin_policy: String, - admin_name: String, - fuel_per_step: u64, - initial_fuel: u64, - max_speed: Speed, - max_ship_fuel: u64, - max_asteria_mining: u64, - min_asteria_distance: u64, - ship_mint_lovelace_fee: u64, - scripts_directory: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -struct Speed { - distance: u64, - time: u64, -} - -#[derive(Debug, PartialEq, Eq, Clone)] -pub enum AsteriaDatum { - Ok { - ship_counter: u16, - shipyard_policy: PolicyId, - }, - MalformedAsteriaDatum, -} - -impl From for Datum { - fn from(asteria_datum: AsteriaDatum) -> Self { - Datum(PlutusData::from(PallasPlutusData::from(asteria_datum)).0) - } -} - -impl From for AsteriaDatum { - fn from(datum: Datum) -> Self { - <_>::from(PallasPlutusData::from(PlutusData(datum.0))) - } -} - -impl From for PallasPlutusData { - fn from(asteria_datum: AsteriaDatum) -> Self { - match asteria_datum { - AsteriaDatum::Ok { - ship_counter, - shipyard_policy, - } => PallasPlutusData::from(PallasPlutusData::Constr(Constr { - tag: 121, - any_constructor: None, - fields: Indef( - [ - PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from( - ship_counter, - )))), - PallasPlutusData::BoundedBytes(BoundedBytes(shipyard_policy.0.to_vec())), - ] - .to_vec(), - ), - })), - AsteriaDatum::MalformedAsteriaDatum => { - PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from(-1)))) - } - } - } -} - -impl From for AsteriaDatum { - fn from(data: PallasPlutusData) -> Self { - if let PallasPlutusData::Constr(Constr { - tag: 121, - any_constructor: None, - fields: Indef(asteria_datum), - }) = data - { - if let [PallasPlutusData::BigInt(BigInt::Int(Int(ship_counter))), PallasPlutusData::BoundedBytes(BoundedBytes(shipyard_policy_vec))] = - &asteria_datum[..] - { - AsteriaDatum::Ok { - ship_counter: TryFrom::::try_from(*ship_counter).unwrap(), - shipyard_policy: H224::from(PallasHash::from(shipyard_policy_vec.as_slice())), - } - } else { - AsteriaDatum::MalformedAsteriaDatum - } - } else { - AsteriaDatum::MalformedAsteriaDatum - } - } -} - -#[derive(Debug, PartialEq, Eq, Clone)] -pub enum PelletDatum { - Ok { - pos_x: i16, - pos_y: i16, - shipyard_policy: PolicyId, - }, - MalformedPelletDatum, -} - -impl From for Datum { - fn from(pellet_datum: PelletDatum) -> Self { - Datum(PlutusData::from(PallasPlutusData::from(pellet_datum)).0) - } -} - -impl From for PelletDatum { - fn from(datum: Datum) -> Self { - <_>::from(PallasPlutusData::from(PlutusData(datum.0))) - } -} - -impl From for PallasPlutusData { - fn from(pellet_datum: PelletDatum) -> Self { - match pellet_datum { - PelletDatum::Ok { - pos_x, - pos_y, - shipyard_policy, - } => PallasPlutusData::from(PallasPlutusData::Constr(Constr { - tag: 121, - any_constructor: None, - fields: Indef( - [ - PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from( - pos_x, - )))), - PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from( - pos_y, - )))), - PallasPlutusData::BoundedBytes(BoundedBytes(shipyard_policy.0.to_vec())), - ] - .to_vec(), - ), - })), - PelletDatum::MalformedPelletDatum => { - PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from(-1)))) - } - } - } -} - -impl From for PelletDatum { - fn from(data: PallasPlutusData) -> Self { - if let PallasPlutusData::Constr(Constr { - tag: 121, - any_constructor: None, - fields: Indef(pellet_datum), - }) = data - { - if let [PallasPlutusData::BigInt(BigInt::Int(Int(pos_x))), PallasPlutusData::BigInt(BigInt::Int(Int(pos_y))), PallasPlutusData::BoundedBytes(BoundedBytes(shipyard_policy_vec))] = - &pellet_datum[..] - { - PelletDatum::Ok { - pos_x: TryFrom::::try_from(*pos_x).unwrap(), - pos_y: TryFrom::::try_from(*pos_y).unwrap(), - shipyard_policy: H224::from(PallasHash::from(shipyard_policy_vec.as_slice())), - } - } else { - PelletDatum::MalformedPelletDatum - } - } else { - PelletDatum::MalformedPelletDatum - } - } -} - -#[derive(Debug, PartialEq, Eq, Clone)] -pub enum ShipDatum { - Ok { - pos_x: i16, - pos_y: i16, - ship_token_name: AssetName, - pilot_token_name: AssetName, - last_move_latest_time: u64, - }, - MalformedShipDatum, -} - -impl From for Datum { - fn from(ship_datum: ShipDatum) -> Self { - Datum(PlutusData::from(PallasPlutusData::from(ship_datum)).0) - } -} - -impl From for ShipDatum { - fn from(datum: Datum) -> Self { - <_>::from(PallasPlutusData::from(PlutusData(datum.0))) - } -} - -impl From for PallasPlutusData { - fn from(ship_datum: ShipDatum) -> Self { - match ship_datum { - ShipDatum::Ok { - pos_x, - pos_y, - ship_token_name, - pilot_token_name, - last_move_latest_time, - } => PallasPlutusData::from(PallasPlutusData::Constr(Constr { - tag: 121, - any_constructor: None, - fields: Indef( - [ - PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from( - pos_x, - )))), - PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from( - pos_y, - )))), - PallasPlutusData::BoundedBytes(BoundedBytes( - ship_token_name.0.clone().into(), - )), - PallasPlutusData::BoundedBytes(BoundedBytes( - pilot_token_name.0.clone().into(), - )), - PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from( - last_move_latest_time, - )))), - ] - .to_vec(), - ), - })), - ShipDatum::MalformedShipDatum => { - PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from(-1)))) - } - } - } -} - -impl From for ShipDatum { - fn from(data: PallasPlutusData) -> Self { - if let PallasPlutusData::Constr(Constr { - tag: 121, - any_constructor: None, - fields: Indef(ship_datum), - }) = data - { - if let [PallasPlutusData::BigInt(BigInt::Int(Int(pos_x))), PallasPlutusData::BigInt(BigInt::Int(Int(pos_y))), PallasPlutusData::BoundedBytes(BoundedBytes(ship_name_vec)), PallasPlutusData::BoundedBytes(BoundedBytes(pilot_name_vec)), PallasPlutusData::BigInt(BigInt::Int(Int(last_move_latest_time)))] = - &ship_datum[..] - { - ShipDatum::Ok { - pos_x: TryFrom::::try_from(*pos_x).unwrap(), - pos_y: TryFrom::::try_from(*pos_y).unwrap(), - ship_token_name: AssetName(String::from_utf8(ship_name_vec.to_vec()).unwrap()), - pilot_token_name: AssetName( - String::from_utf8(pilot_name_vec.to_vec()).unwrap(), - ), - last_move_latest_time: TryFrom::::try_from( - *last_move_latest_time, - ) - .unwrap(), - } - } else { - ShipDatum::MalformedShipDatum - } - } else { - ShipDatum::MalformedShipDatum - } - } -} diff --git a/game/src/lib.rs b/game/src/lib.rs index 7e28c3a..f11c00d 100644 --- a/game/src/lib.rs +++ b/game/src/lib.rs @@ -1,5 +1,7 @@ mod game; +mod queries; mod tests; +mod types; use clap::{Args, Subcommand}; use gpc_wallet::{context::Context, keystore, utils}; @@ -68,20 +70,20 @@ impl GameCommand { .unwrap(); Ok(()) } + Command::DeployScripts(args) => { + let _ = game::deploy_scripts(args).await.unwrap(); + Ok(()) + } Command::ShowAsteria(args) => { - let _ = game::show_asteria(&db, args).await.unwrap(); + let _ = queries::show_asteria(&db, args).await.unwrap(); Ok(()) } Command::ShowPellets(args) => { - let _ = game::show_pellets(&db, args).await.unwrap(); + let _ = queries::show_pellets(&db, args).await.unwrap(); Ok(()) } Command::ShowShips(args) => { - let _ = game::show_ships(&db, args).await.unwrap(); - Ok(()) - } - Command::DeployScripts(args) => { - let _ = game::deploy_scripts(args).await.unwrap(); + let _ = queries::show_ships(&db, args).await.unwrap(); Ok(()) } }, diff --git a/game/src/queries.rs b/game/src/queries.rs new file mode 100644 index 0000000..59bd3b3 --- /dev/null +++ b/game/src/queries.rs @@ -0,0 +1,208 @@ +use crate::{types::*, ShowAsteriaArgs, ShowPelletsArgs, ShowShipsArgs}; +use anyhow::anyhow; +use colored::Colorize; +use gpc_wallet::sync; +use griffin_core::types::{ + compute_plutus_v2_script_hash, Address, Datum, PlutusScript, PolicyId, Value, +}; +use parity_scale_codec::Decode; +use sled::Db; + +/// Show Asteria UTxO. +pub async fn show_asteria(db: &Db, args: ShowAsteriaArgs) -> anyhow::Result<()> { + println!("\n###### ASTERIA ###########\n"); + + let params_json: String = std::fs::read_to_string(args.params_path) + .map_err(|e| anyhow!("Failed to read params file: {}", e))?; + + let params: ScriptsParams = + serde_json::from_str(¶ms_json).map_err(|e| anyhow!("Invalid params JSON: {}", e))?; + + let asteria_script_hex: &str = + &std::fs::read_to_string(params.scripts_directory.clone() + "asteria.txt") + .map_err(|e| anyhow!("Failed to read asteria script: {}", e))?; + + let wallet_unspent_tree = db.open_tree(sync::UNSPENT)?; + for x in wallet_unspent_tree.iter() { + let (input_ivec, owner_amount_datum_ivec) = x?; + let input = hex::encode(input_ivec); + let (owner_pubkey, value, datum_option) = + <(Address, Value, Option)>::decode(&mut &owner_amount_datum_ivec[..])?; + + let asteria_script: PlutusScript = + PlutusScript(hex::decode(asteria_script_hex).expect("Failed to decode asteria script")); + let asteria_hash: PolicyId = compute_plutus_v2_script_hash(asteria_script.clone()); + let asteria_address: Address = Address( + hex::decode("70".to_owned() + &hex::encode(asteria_hash)) + .map_err(|e| anyhow!("Failed to decode asteria address: {}", e))?, + ); + + if owner_pubkey == asteria_address { + let asteria_datum = datum_option.map(|d| AsteriaDatum::from(d)); + match asteria_datum { + None | Some(AsteriaDatum::MalformedAsteriaDatum) => { + println!( + "{}: datum {:?}, value: {}", + input, + asteria_datum, + value.normalize(), + ); + } + Some(AsteriaDatum::Ok { + ship_counter, + shipyard_policy, + }) => { + println!( + "{}:\n {} {:?}\n {} {:#?}\n {} {}\n", + input.bold(), + "SHIP COUNTER:".bold(), + ship_counter, + "SHIPYARD POLICY:".bold(), + shipyard_policy, + "VALUE:".bold(), + value.normalize(), + ); + } + } + } + } + + Ok(()) +} + +/// Show pellet UTxOs. +pub async fn show_pellets(db: &Db, args: ShowPelletsArgs) -> anyhow::Result<()> { + println!("\n###### PELLETS ###########\n"); + + let params_json: String = std::fs::read_to_string(args.params_path) + .map_err(|e| anyhow!("Failed to read params file: {}", e))?; + + let params: ScriptsParams = + serde_json::from_str(¶ms_json).map_err(|e| anyhow!("Invalid params JSON: {}", e))?; + + let pellet_script_hex: &str = + &std::fs::read_to_string(params.scripts_directory.clone() + "pellet.txt") + .map_err(|e| anyhow!("Failed to read pellet script: {}", e))?; + + let wallet_unspent_tree = db.open_tree(sync::UNSPENT)?; + for x in wallet_unspent_tree.iter() { + let (input_ivec, owner_amount_datum_ivec) = x?; + let input = hex::encode(input_ivec); + let (owner_pubkey, value, datum_option) = + <(Address, Value, Option)>::decode(&mut &owner_amount_datum_ivec[..])?; + + let pellet_script: PlutusScript = + PlutusScript(hex::decode(pellet_script_hex).expect("Failed to decode pellet script")); + let pellet_hash: PolicyId = compute_plutus_v2_script_hash(pellet_script.clone()); + let pellet_address: Address = Address( + hex::decode("70".to_owned() + &hex::encode(pellet_hash)) + .map_err(|e| anyhow!("Failed to decode pellet address: {}", e))?, + ); + + if owner_pubkey == pellet_address { + let pellet_datum = datum_option.map(|d| PelletDatum::from(d)); + match pellet_datum { + None | Some(PelletDatum::MalformedPelletDatum) => { + println!( + "{}: datum {:?}, value: {}", + input, + pellet_datum, + value.normalize(), + ); + } + Some(PelletDatum::Ok { + pos_x, + pos_y, + shipyard_policy, + }) => { + println!( + "{}:\n {} {:?}\n {} {:?}\n {} {:#?}\n {} {}\n", + input.bold(), + "POS X:".bold(), + pos_x, + "POS Y:".bold(), + pos_y, + "SHIPYARD POLICY:".bold(), + shipyard_policy, + "VALUE:".bold(), + value.normalize(), + ); + } + } + } + } + + Ok(()) +} + +/// Show ship UTxOs. +pub async fn show_ships(db: &Db, args: ShowShipsArgs) -> anyhow::Result<()> { + println!("\n###### SHIPS ###########\n"); + + let params_json: String = std::fs::read_to_string(args.params_path) + .map_err(|e| anyhow!("Failed to read params file: {}", e))?; + + let params: ScriptsParams = + serde_json::from_str(¶ms_json).map_err(|e| anyhow!("Invalid params JSON: {}", e))?; + + let spacetime_script_hex: &str = + &std::fs::read_to_string(params.scripts_directory.clone() + "spacetime.txt") + .map_err(|e| anyhow!("Failed to read spacetime script: {}", e))?; + + let wallet_unspent_tree = db.open_tree(sync::UNSPENT)?; + for x in wallet_unspent_tree.iter() { + let (input_ivec, owner_amount_datum_ivec) = x?; + let input = hex::encode(input_ivec); + let (owner_pubkey, value, datum_option) = + <(Address, Value, Option)>::decode(&mut &owner_amount_datum_ivec[..])?; + + let spacetime_script: PlutusScript = PlutusScript( + hex::decode(spacetime_script_hex).expect("Failed to decode spacetime script"), + ); + let spacetime_hash: PolicyId = compute_plutus_v2_script_hash(spacetime_script.clone()); + let spacetime_address: Address = Address( + hex::decode("70".to_owned() + &hex::encode(spacetime_hash)) + .map_err(|e| anyhow!("Failed to decode spacetime address: {}", e))?, + ); + + if owner_pubkey == spacetime_address { + let ship_datum = datum_option.map(|d| ShipDatum::from(d)); + match ship_datum { + None | Some(ShipDatum::MalformedShipDatum) => { + println!( + "{}: datum {:?}, value: {}", + input, + ship_datum, + value.normalize(), + ); + } + Some(ShipDatum::Ok { + pos_x, + pos_y, + ship_token_name, + pilot_token_name, + last_move_latest_time, + }) => { + println!( + "{}:\n {} {:?}\n {} {:?}\n {} {:?}\n {} {:?}\n {} {:?}\n {} {}\n", + input.bold(), + "POS X:".bold(), + pos_x, + "POS Y:".bold(), + pos_y, + "SHIP TOKEN NAME:".bold(), + ship_token_name.0, + "PILOT TOKEN NAME:".bold(), + pilot_token_name.0, + "LAST MOVE LATEST TIME:".bold(), + last_move_latest_time, + "VALUE:".bold(), + value.normalize(), + ); + } + } + } + } + + Ok(()) +} diff --git a/game/src/types.rs b/game/src/types.rs new file mode 100644 index 0000000..1b12950 --- /dev/null +++ b/game/src/types.rs @@ -0,0 +1,275 @@ +use griffin_core::{ + h224::H224, + pallas_codec::{ + minicbor, + utils::{Int, MaybeIndefArray::Indef}, + }, + pallas_crypto::hash::Hash as PallasHash, + pallas_primitives::babbage::{BigInt, BoundedBytes, Constr, PlutusData as PallasPlutusData}, + types::{AssetName, Datum, PlutusData, PolicyId}, +}; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub(crate) struct ScriptsParams { + pub admin_policy: String, + pub admin_name: String, + pub fuel_per_step: u64, + pub initial_fuel: u64, + pub max_speed: Speed, + pub max_ship_fuel: u64, + pub max_asteria_mining: u64, + pub min_asteria_distance: u64, + pub ship_mint_lovelace_fee: u64, + pub scripts_directory: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub(crate) struct Speed { + pub distance: u64, + pub time: u64, +} + +#[derive(Debug, PartialEq, Eq, Clone)] +pub enum AsteriaDatum { + Ok { + ship_counter: u16, + shipyard_policy: PolicyId, + }, + MalformedAsteriaDatum, +} + +impl From for Datum { + fn from(asteria_datum: AsteriaDatum) -> Self { + Datum(PlutusData::from(PallasPlutusData::from(asteria_datum)).0) + } +} + +impl From for AsteriaDatum { + fn from(datum: Datum) -> Self { + <_>::from(PallasPlutusData::from(PlutusData(datum.0))) + } +} + +impl From for PallasPlutusData { + fn from(asteria_datum: AsteriaDatum) -> Self { + match asteria_datum { + AsteriaDatum::Ok { + ship_counter, + shipyard_policy, + } => PallasPlutusData::from(PallasPlutusData::Constr(Constr { + tag: 121, + any_constructor: None, + fields: Indef( + [ + PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from( + ship_counter, + )))), + PallasPlutusData::BoundedBytes(BoundedBytes(shipyard_policy.0.to_vec())), + ] + .to_vec(), + ), + })), + AsteriaDatum::MalformedAsteriaDatum => { + PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from(-1)))) + } + } + } +} + +impl From for AsteriaDatum { + fn from(data: PallasPlutusData) -> Self { + if let PallasPlutusData::Constr(Constr { + tag: 121, + any_constructor: None, + fields: Indef(asteria_datum), + }) = data + { + if let [PallasPlutusData::BigInt(BigInt::Int(Int(ship_counter))), PallasPlutusData::BoundedBytes(BoundedBytes(shipyard_policy_vec))] = + &asteria_datum[..] + { + AsteriaDatum::Ok { + ship_counter: TryFrom::::try_from(*ship_counter).unwrap(), + shipyard_policy: H224::from(PallasHash::from(shipyard_policy_vec.as_slice())), + } + } else { + AsteriaDatum::MalformedAsteriaDatum + } + } else { + AsteriaDatum::MalformedAsteriaDatum + } + } +} + +#[derive(Debug, PartialEq, Eq, Clone)] +pub enum PelletDatum { + Ok { + pos_x: i16, + pos_y: i16, + shipyard_policy: PolicyId, + }, + MalformedPelletDatum, +} + +impl From for Datum { + fn from(pellet_datum: PelletDatum) -> Self { + Datum(PlutusData::from(PallasPlutusData::from(pellet_datum)).0) + } +} + +impl From for PelletDatum { + fn from(datum: Datum) -> Self { + <_>::from(PallasPlutusData::from(PlutusData(datum.0))) + } +} + +impl From for PallasPlutusData { + fn from(pellet_datum: PelletDatum) -> Self { + match pellet_datum { + PelletDatum::Ok { + pos_x, + pos_y, + shipyard_policy, + } => PallasPlutusData::from(PallasPlutusData::Constr(Constr { + tag: 121, + any_constructor: None, + fields: Indef( + [ + PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from( + pos_x, + )))), + PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from( + pos_y, + )))), + PallasPlutusData::BoundedBytes(BoundedBytes(shipyard_policy.0.to_vec())), + ] + .to_vec(), + ), + })), + PelletDatum::MalformedPelletDatum => { + PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from(-1)))) + } + } + } +} + +impl From for PelletDatum { + fn from(data: PallasPlutusData) -> Self { + if let PallasPlutusData::Constr(Constr { + tag: 121, + any_constructor: None, + fields: Indef(pellet_datum), + }) = data + { + if let [PallasPlutusData::BigInt(BigInt::Int(Int(pos_x))), PallasPlutusData::BigInt(BigInt::Int(Int(pos_y))), PallasPlutusData::BoundedBytes(BoundedBytes(shipyard_policy_vec))] = + &pellet_datum[..] + { + PelletDatum::Ok { + pos_x: TryFrom::::try_from(*pos_x).unwrap(), + pos_y: TryFrom::::try_from(*pos_y).unwrap(), + shipyard_policy: H224::from(PallasHash::from(shipyard_policy_vec.as_slice())), + } + } else { + PelletDatum::MalformedPelletDatum + } + } else { + PelletDatum::MalformedPelletDatum + } + } +} + +#[derive(Debug, PartialEq, Eq, Clone)] +pub enum ShipDatum { + Ok { + pos_x: i16, + pos_y: i16, + ship_token_name: AssetName, + pilot_token_name: AssetName, + last_move_latest_time: u64, + }, + MalformedShipDatum, +} + +impl From for Datum { + fn from(ship_datum: ShipDatum) -> Self { + Datum(PlutusData::from(PallasPlutusData::from(ship_datum)).0) + } +} + +impl From for ShipDatum { + fn from(datum: Datum) -> Self { + <_>::from(PallasPlutusData::from(PlutusData(datum.0))) + } +} + +impl From for PallasPlutusData { + fn from(ship_datum: ShipDatum) -> Self { + match ship_datum { + ShipDatum::Ok { + pos_x, + pos_y, + ship_token_name, + pilot_token_name, + last_move_latest_time, + } => PallasPlutusData::from(PallasPlutusData::Constr(Constr { + tag: 121, + any_constructor: None, + fields: Indef( + [ + PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from( + pos_x, + )))), + PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from( + pos_y, + )))), + PallasPlutusData::BoundedBytes(BoundedBytes( + ship_token_name.0.clone().into(), + )), + PallasPlutusData::BoundedBytes(BoundedBytes( + pilot_token_name.0.clone().into(), + )), + PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from( + last_move_latest_time, + )))), + ] + .to_vec(), + ), + })), + ShipDatum::MalformedShipDatum => { + PallasPlutusData::BigInt(BigInt::Int(Int(minicbor::data::Int::from(-1)))) + } + } + } +} + +impl From for ShipDatum { + fn from(data: PallasPlutusData) -> Self { + if let PallasPlutusData::Constr(Constr { + tag: 121, + any_constructor: None, + fields: Indef(ship_datum), + }) = data + { + if let [PallasPlutusData::BigInt(BigInt::Int(Int(pos_x))), PallasPlutusData::BigInt(BigInt::Int(Int(pos_y))), PallasPlutusData::BoundedBytes(BoundedBytes(ship_name_vec)), PallasPlutusData::BoundedBytes(BoundedBytes(pilot_name_vec)), PallasPlutusData::BigInt(BigInt::Int(Int(last_move_latest_time)))] = + &ship_datum[..] + { + ShipDatum::Ok { + pos_x: TryFrom::::try_from(*pos_x).unwrap(), + pos_y: TryFrom::::try_from(*pos_y).unwrap(), + ship_token_name: AssetName(String::from_utf8(ship_name_vec.to_vec()).unwrap()), + pilot_token_name: AssetName( + String::from_utf8(pilot_name_vec.to_vec()).unwrap(), + ), + last_move_latest_time: TryFrom::::try_from( + *last_move_latest_time, + ) + .unwrap(), + } + } else { + ShipDatum::MalformedShipDatum + } + } else { + ShipDatum::MalformedShipDatum + } + } +} From ab202d699340c9618422608b329a9f3c32fbe52c Mon Sep 17 00:00:00 2001 From: Francisco Joray Date: Wed, 31 Dec 2025 18:24:28 -0300 Subject: [PATCH 4/5] docs: add section for game query commands --- game/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/game/README.md b/game/README.md index c09cbe6..1a2855c 100644 --- a/game/README.md +++ b/game/README.md @@ -166,4 +166,6 @@ This command can be triggered when the ship reaches Asteria, i.e., its coordinat - *mine-coin-amount*: amount of coin to be mined from Asteria. This must be less or equal to the allowed maximum percentage of the total prize defined by MAX_ASTERIA_MINING. - *params-path*: path to the JSON file containing all the game scripts parameters and the applied scripts directory. +### Queries +There are also three query commands that allow the user to inspect the game state UTxOs, with their datums in a human-readable format: `show-asteria`, `show-pellets`, and `show-ships`. Each of them takes no arguments, except for the `params-path` argument that is common to all game commands. From f55c4b87261a05ed7ae9d1e49492d10c6a5388af Mon Sep 17 00:00:00 2001 From: Francisco Joray Date: Wed, 31 Dec 2025 18:25:39 -0300 Subject: [PATCH 5/5] docs: add game board image to README --- README.md | 2 ++ game/game-board.png | Bin 0 -> 186214 bytes 2 files changed, 2 insertions(+) create mode 100644 game/game-board.png diff --git a/README.md b/README.md index f2fd203..4985ca3 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,8 @@ As the result of the discovery process, after surveying many developers, it was In this repository we include the [on-chain code](./game/onchain/), which comes with a [design document](./game/onchain/docs/design/design.md) that thoroughly explains the transactions involved in the game. In the game [src](./game/src/) you can find the implementation of the commands necessary to play the game and a [README](./game/README.md) that goes over the app design, in the context of the game's integration into the node, and [instructions](./game/README.md#game-usage) on how to run the commands. +![Asteria Game Board](./game/game-board.png "Game Board") + ## Setting up a Partner Chain The project includes the `partner-chains-cli` from IOG's [Partner Chain SDK](https://github.com/input-output-hk/partner-chains). This `CLI` allows us to set up governance UTxOs on the Cardano side for the partner chain. An extensive explanation on the integration and usage of the CLI can be found at the previously mentioned [partner_chain_integration](./docs/dev_logs/partner_chain_integration.md) document. diff --git a/game/game-board.png b/game/game-board.png new file mode 100644 index 0000000000000000000000000000000000000000..307dddc07e8618a7d14ccdabf6293b9db118115a GIT binary patch literal 186214 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 z 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 F{1;&=tup`s literal 0 HcmV?d00001