From a4d1532c3dc278a03de4a39b38036617f48257d3 Mon Sep 17 00:00:00 2001 From: tuxmain <tuxmain@zettascript.org> Date: Sat, 12 Nov 2022 23:06:21 +0100 Subject: [PATCH] chore: update subxt --- Cargo.lock | 125 +++++++++++++++++-------- Cargo.toml | 10 +- res/metadata.scale | Bin 125644 -> 128198 bytes src/cache.rs | 17 ++-- src/main.rs | 225 +++++++++++++++++++++++++++++++-------------- 5 files changed, 256 insertions(+), 121 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 55b25b2..da84061 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1223,9 +1223,9 @@ dependencies = [ [[package]] name = "jsonrpsee" -version = "0.14.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11e017217fcd18da0a25296d3693153dd19c8a6aadab330b3595285d075385d1" +checksum = "8bd0d559d5e679b1ab2f869b486a11182923863b1b3ee8b421763cdd707b783a" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -1233,9 +1233,9 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.14.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce395539a14d3ad4ec1256fde105abd36a2da25d578a291cabe98f45adfdb111" +checksum = "8752740ecd374bcbf8b69f3e80b0327942df76f793f8d4e60d3355650c31fb74" dependencies = [ "futures-util", "http", @@ -1254,9 +1254,9 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.14.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16efcd4477de857d4a2195a45769b2fe9ebb54f3ef5a4221d3b014a4fe33ec0b" +checksum = "f3dc3e9cf2ba50b7b1d7d76a667619f82846caa39e8e8daa8a4962d74acaddca" dependencies = [ "anyhow", "async-lock", @@ -1272,13 +1272,14 @@ dependencies = [ "thiserror", "tokio", "tracing", + "tracing-futures", ] [[package]] name = "jsonrpsee-types" -version = "0.14.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcf76cd316f5d3ad48138085af1f45e2c58c98e02f0779783dbb034d43f7c86" +checksum = "e290bba767401b646812f608c099b922d8142603c9e73a50fb192d3ac86f4a0d" dependencies = [ "anyhow", "beef", @@ -2104,6 +2105,18 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" +[[package]] +name = "scale-decode" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c70dece385bc3e5918109830d9509806b5d4525fdf594e3463078c529122979e" +dependencies = [ + "bitvec", + "parity-scale-codec", + "scale-info", + "thiserror", +] + [[package]] name = "scale-info" version = "2.1.2" @@ -2130,6 +2143,23 @@ dependencies = [ "syn", ] +[[package]] +name = "scale-value" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae8b296b3ebcb3425661e9b612ccc34cb1064483a61dc379c65e6b1463498f1" +dependencies = [ + "bitvec", + "either", + "frame-metadata", + "parity-scale-codec", + "scale-decode", + "scale-info", + "serde", + "thiserror", + "yap", +] + [[package]] name = "schannel" version = "0.1.20" @@ -2246,9 +2276,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.83" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38dd04e3c8279e75b31ef29dbdceebfe5ad89f4d0937213c53f7d49d01b3d5a7" +checksum = "6ce777b7b150d76b9cf60d28b55f5847135a003f7d7350c6be7a773508ce7d45" dependencies = [ "itoa 1.0.3", "ryu", @@ -2384,7 +2414,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "parity-scale-codec", "scale-info", @@ -2397,7 +2427,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "integer-sqrt", "num-traits", @@ -2412,7 +2442,7 @@ dependencies = [ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "base58", "bitflags", @@ -2458,7 +2488,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "blake2", "byteorder", @@ -2472,7 +2502,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "proc-macro2", "quote", @@ -2482,7 +2512,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "environmental", "parity-scale-codec", @@ -2493,7 +2523,7 @@ dependencies = [ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "futures", "hash-db", @@ -2518,7 +2548,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "async-trait", "futures", @@ -2534,7 +2564,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "backtrace", "lazy_static", @@ -2544,7 +2574,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "either", "hash256-std-hasher", @@ -2566,7 +2596,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -2583,7 +2613,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "Inflector", "proc-macro-crate", @@ -2595,7 +2625,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "hash-db", "log", @@ -2617,12 +2647,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "impl-serde", "parity-scale-codec", @@ -2635,7 +2665,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "parity-scale-codec", "sp-std", @@ -2647,7 +2677,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "hash-db", "memory-db", @@ -2663,7 +2693,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.23#3c05363666a2e719807713830b7d6eee0a9598d2" +source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9.26#16476332c7c5a6a6478c4072aa3cadb9b7c28c83" dependencies = [ "impl-trait-for-tuples", "log", @@ -2726,8 +2756,8 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "subxt" -version = "0.22.0" -source = "git+https://github.com/duniter/subxt.git?branch=duniter-substrate-v0.9.23#e0fcf196eb6192e905e1784580f64363e2213556" +version = "0.23.0" +source = "git+https://github.com/duniter/subxt.git?branch=duniter-substrate-v0.9.26#9ab601b10b4254d64368371f07e09934a0f55bf7" dependencies = [ "bitvec", "derivative", @@ -2737,7 +2767,9 @@ dependencies = [ "jsonrpsee", "parity-scale-codec", "parking_lot", + "scale-decode", "scale-info", + "scale-value", "serde", "serde_json", "sp-core", @@ -2750,8 +2782,8 @@ dependencies = [ [[package]] name = "subxt-codegen" -version = "0.22.0" -source = "git+https://github.com/duniter/subxt.git?branch=duniter-substrate-v0.9.23#e0fcf196eb6192e905e1784580f64363e2213556" +version = "0.23.0" +source = "git+https://github.com/duniter/subxt.git?branch=duniter-substrate-v0.9.26#9ab601b10b4254d64368371f07e09934a0f55bf7" dependencies = [ "darling", "frame-metadata", @@ -2767,8 +2799,8 @@ dependencies = [ [[package]] name = "subxt-macro" -version = "0.22.0" -source = "git+https://github.com/duniter/subxt.git?branch=duniter-substrate-v0.9.23#e0fcf196eb6192e905e1784580f64363e2213556" +version = "0.23.0" +source = "git+https://github.com/duniter/subxt.git?branch=duniter-substrate-v0.9.26#9ab601b10b4254d64368371f07e09934a0f55bf7" dependencies = [ "darling", "proc-macro-error", @@ -2778,8 +2810,8 @@ dependencies = [ [[package]] name = "subxt-metadata" -version = "0.22.0" -source = "git+https://github.com/duniter/subxt.git?branch=duniter-substrate-v0.9.23#e0fcf196eb6192e905e1784580f64363e2213556" +version = "0.23.0" +source = "git+https://github.com/duniter/subxt.git?branch=duniter-substrate-v0.9.26#9ab601b10b4254d64368371f07e09934a0f55bf7" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -2921,16 +2953,15 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.20.1" +version = "1.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a8325f63a7d4774dd041e363b2409ed1c5cbbd0f867795e661df066b2b0a581" +checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099" dependencies = [ "autocfg", "bytes", "libc", "memchr", "mio", - "once_cell", "pin-project-lite", "socket2", "tokio-macros", @@ -3032,6 +3063,16 @@ dependencies = [ "valuable", ] +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + [[package]] name = "tracing-log" version = "0.1.3" @@ -3450,6 +3491,12 @@ dependencies = [ "tap", ] +[[package]] +name = "yap" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc77f52dc9e9b10d55d3f4462c3b7fc393c4f17975d641542833ab2d3bc26ef" + [[package]] name = "zeroize" version = "1.5.7" diff --git a/Cargo.toml b/Cargo.toml index 532712f..14f68a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,14 +9,14 @@ version = "0.1.0" [dependencies] anyhow = "1.0" clap = { version = "3.0", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.1.5" } env_logger = "0.9.0" graphql_client = { version = "0.11.0", features = ["reqwest"] } hex = "0.4.3" logs = "0.5" -codec = { package = "parity-scale-codec", version = "3.1.5" } reqwest = "0.11.11" serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0.64" -sp-core = { git = "https://github.com/duniter/substrate", branch = "duniter-substrate-v0.9.23" } -subxt = { git = 'https://github.com/duniter/subxt.git', branch = 'duniter-substrate-v0.9.23' } -tokio = { version = "1.15.0", features = ["macros"] } +serde_json = "1.0.87" +sp-core = { git = "https://github.com/duniter/substrate", branch = "duniter-substrate-v0.9.26" } +subxt = { git = "https://github.com/duniter/subxt.git", branch = "duniter-substrate-v0.9.26" } +tokio = { version = "1.21.1", features = ["macros"] } diff --git a/res/metadata.scale b/res/metadata.scale index 10f4232185e31dcb87b88cd33a9731c8efca1265..3ec2c111f3089edbf7b193d08cddc0ea353bec76 100644 GIT binary patch delta 10412 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 delta 8425 zcmd5>dstNEy8nJ_7BC>{D4;V6I4B?}B6!EVfI^CjH&C~?aAX!R2{SMk1&xGVn%1_m zFa5Ng7q*(>BPLCr$+nd|X<K(%Qc~*1omO^qr>SN8=u@73-n9mmZk~V6^X%h;Yklke z-tYE)@8$Qt^WNp4<IO>VrHb3qp|K%wqYfE-t1b#z{B2!N6!QzZclj)9C*AYdz*E<E z;b8&sx|gw)Pl+<}yntwI=dOS_?BN>&VzH0EP3^<{%YY=b@J@j#_>zwaOu{AZ2u#Bj zUKjW~-Ax*ia?-@3f}-&w9~qR20PYBygkbK_kK;PM5$)+aozK&EMkk`pMg%{mABY%! zN1rAq0@b|3I1|qe?u=Ak7@UMO&V%DI()(uc-j3pACd~Y5x4+6S0^l7Z(}Nkpt%}P% zV1rkV?2hCY8I$$Q$TrBvDP?Y(!!FBtcoBNTWQSd0j2UtrrHagm4UE0abE3x5S=UCb z(w<@7e$kmy&{oDI1KZ9k%qiH#>&#c$?P5%4pwW7^$GbHq86=4hdydBI-j2O===eJE zzro&6S3YQD2YF0vY{VgqP^<$64^B-RK76WYVTrAPu|s@LY$A#8$=HW+l)oSQ5>E2M zxMpgPh)<0;ju9^B&qf^QzmHGsc#`Hn#ZGA_JIzk>{Lf7M<9IV##G#q!!b5tO;=H$_ zcTeCv|6@WdUCN<^f8vt3HVfUTx1F~ou`_VRd#%rS;JSBM(q>)Ib;bf1yUCMJ_T>NS zpN3oBw3K+@7GIG1jP@MDdk$C;bc@(z_9K6Fz&C(*^T0*~g9H~Ku>kPKbKSgKhmV#J z>^(oCMx8n{Ege$(Ha(qw(h~um{&{!)&gcm+@sRW)T<6a8cXcM{dB*2qd}77`MDfQn z`jdM4Deq?Fl45in(}Fm@Z|oF4c5I2(I<7q@^Y=4fq}GD0TqzO4@Hk@mnXJv|$15Iw zLF%Vby7S)STv95;)@pR+-f><G=0)S<>AcU5&jNj%%6?XRCh|W_sHRr?iG@h>x+fl% zq>&Kw`ohR7!a5+*Yni-T;@c+J$bN#R&*+#%Vvx)%TYb4%4qr5VD5mjk)9Ds?(`Qj3 zY#Q|h8rTf*3&9aw%8kZsZ%l52jQM=RtT9l$Yi6AXW^?=O{-*irEEX{OBPB{mV2Vme zU^c#GP8WWB_QNRUVRPc8Qkok{!^*)zVYEA(rIwO%K+a=Ga+E1fi>mPVNU^0ByVc@$ zI4k`;tej?>-opb7^P9$qS&FTw*gcAYSS#|~4!5Pm!wqvIBYuU4d3eU$I8<sos+t=f zRR!ctRh*eNSDD3KP&~H8;&P4f3>+|uu_|qw{OsI;QjOZ|%H!t^#tJ@fUY}^P+d<Pk zcDJom$#pwz_99x{R$5k)Z?}{x;M?cT#p)O4j~uufa_Csc64iXyfXR#=OnXRc!RU|V zv<?Qgj#@gsW||wlW%EChQa7ohs|Bk?TNkhczwiM&h>`wwaMyx()bW=Vl+!cRVwCp- zFY+laBTu&^>gr(NJxmciIV^-fW9b-P55stis~BeJ!)KDb$eGmhy%rPd`B95mo&jpq z+UD``3wy{7zya;!FAJmO1HcaLBeNh%zHqmvu^>jej2DU?;bW}v@@?RR#>~EJH%G z_HkYb<nxqRa-lU!H95`d!hCKij3!&DE_|GnuBJGjKT;GamrJcHoGprxJra)5==pqJ zaV*_hP4Q~EO2Rp9!bfcb={7doR$;X^c;%x#X=II(@6|7QO_mzKPZ&(R*)bCP`6SnL z63Z5n#^YrNfAalG`SU;d{*$w=&37}kJ?=OXz#rY&c#Dr(JVa^&|NE9`??bdVKLt%* z&*Do!v-gpTCsf+!l__bB&}Un549oztqp(o1TNURqy1r~HgTYneaGwASx%6g8DYQ9V z?)+lKLOhLp;!;!lM!+~;`(~_>moFWNBYelw1QOE+OXpBKaak-0X7aLLzv^&L@RiHr z(ZuVQWkKQJEgK{?L!2Lq?mY9c9ylW=q#-K$9FUSxQsP*mSk-N~R4qC~|7E?=$j<RC zk9lx`M^yF4MQ>JBtrUEb`T~vYGWdcpBM+*M##PbOAHDg4rXb>(QN2oTrL=?Dt}Mwf zbSlb4ZdegXz5Q0aguDFLRtDZ}`iI6n)%9MdM&Tu^zP`({e03<f<Ug!_S9h1PWX)b& z<?+v2aD%UUc4F-JfO)QG*hA(4Df7w1*bQ}~)$DtE>B2Rex()GRCVKEL&n4cSgw~NR zf~R&L=-u|54$>X)wJ)T2Pe1Q#ZI5gvy}<P<V@>2B?<jsvQmOsd59n}}uF^PJ^IbB# z${p)XVML0}C@64{TTm~V%u=Gr9K#Q;A4TZlhxN~dQov!lYHdrw`~@+JKtz+M3~5hf zsS&J`#J9$D<%>3SM}+sO4OsyMDo$)l#zFq$rjc~r!#Af>lwGzthvLq$&6)J<uqC0( zuSMJ_i6VPfUa)1593#>AjK$q}m)hRQ@t)h#9Y3dys*RSUNE3f#+qiadaFPEkQLM>k z-mopbTNE6HW_PhdH(KE~yA+p;oO6=d?J)Cp+xrArl@d#3C-9Nm<ITioacjH_OB@A@ z%r09Ix$zQmjw&$@{E6+oIwvT}MakyWl#~>+#^p-n89Tx!#$k!Aq{K{XJN;9T0+}ry zcd^51b63*3ZnMYLI+MA`wpg*73vD#JZK-1QPh_^Z%nL0pC7EZvQb6Ih?v?31;v|gE zD)-nHI|{U*GGcs^c`|wSI7vUrRhG}^*G2K6J0p<Db9P!NBEGuwchsI!7Z-9+o{4^v zoJ;6!bzRSX2mN*%t{Lh`3C4t(N#@){2BS+UaM-PFNUR@UxhqFXl?XtY_&2*cP&782 z=}OOtI&)l_)T*mP2F+(IP1T2VO&>;5Q`YyRaV+EB4zhk@2id>eK^qdw;-~ATn6tGR zv(y=LBz+{Ex4_|43^N@zO*yCWal0SF4F1IK1lYFi*)37Ke$N~V<@)+X^mNw`pcuci zJ{A^!yxv6Zuj+dTTWC^Ak(k1}>>ViCB*J|09b<FVn|6Dg1WjdD%B%NwrAWVFui5a^ z<CaS*)C=b=)L+k+?~n8vUL~}qHv4-E_gU^afoly{TkSLmh62(dKX-3$2_%n1xG<V~ zU+?9ggMat>GpP42-=7PqQc}^P(R<}TigZ$y#IN<~#vN}apoTYI>caQF8Au3o|C^Ho zXym5GR7~>@IW!5~rvXVhO6fwyIaak@26LIyQRZ-2XjwnohmAAjNMai_wY4Lgym<vf zq@|2l7c1Aj>F<R}<ec-4Cg38kI%=f3*B^Z@NMEDMi?J2F-^t=Ou7{Y8oOJz^P~222 zt(FL*8rvDh(wPY}&<Z^HBl2(F*pI7$HQpVk3V^lV;7=$fZ{mOcba+^;gh4Zvf)UwP zcjaWl9-~+wzi}Z4YxvsJ1L+oyoHk=E|LSz2riML<QoXlJFR<{e0;|g+vvm^E6}35h z`2Aa?9k1ghXQC%;l<unQU{cqOMAv0#>bgm43rh$M{X8{+>i-z4r6Ck137#A}S0L3% zeAwA!dU=b^>XB0?g^n*%osB!+>apA0iZg$S!yWFfEK^+L{Wsz&ww2{j(wAv*TjcxR zm1ZVK-`3qS?)cj_3KU^2Tu0t^=Vz3I5rXYY?K_{nsCDcCAN9EtQQn5nqjdE8@Zt?g zQ;qJe+Iag?vP4-!$xTzM#=LxUD1YwjUNqYK^&9%OUEY^({wuI8fgk@NM1%9u-tT|- zR1S~(rAXq|okv<&Jt+U0Mh9T^8s=q9l8X6zipfA6`UyAioqs>RCnfZkFxdCHOumTj z?^Jf8uU!ysQCr9%NWm@N;1C4J4-ckLo<|v)(@{~GN7AEg(xz(YErfbfhme;l)*v!z z@GxQ<qk8Ab9#!E<gyh!qHRfr)>JB*Fu61osH`GYsH1W?bcCarb3fpxZ?#_MBKBIhR z%(yMLj=vU%H9FLbszi8^<4f&>sW2J_`7KMyca;$!(j$Daiajrief<fE`r(A{LSHNd zruj1aAys`ZPDUSy(o{r;{n7+=zRjsfmb(lpbdvJtyF6uO4yQZPMfrlIND((iBUb2! zpj+HA7#Vb=jCUyM(;0q)|IjRS_stoCY(lWYHw=`wi>9IQ(AT(OaNH+;ISfiGkit1% zaT*o}K41^USSRMBW7%)9sLKjn2F8W0L*y7siN#)^(0=vM+pOz+^E0qiPid~?(FxN8 zEbVgsUh0#fMMz407_0O(Ou!YON^G8l;qy<?=zF;H6wFgvAt>FrQ&DB4I9)ZZzGHeT zfg)oKiAdJ(N?<EgS*_MF`Xd61kk}fnwN{tF){4P7=!<neOAg2%Z4^f)V?8#Bc~f9T zt!SKrA*R~jl(Bjz;cv*fG%tG{M%8)c(aJk?1X)bJN2a2`&Q$ln(NRbJqw96|hu5q7 zJ<1w%TAm|r=b~%p{kprRwqK{Fmu$c2nTN$VAU5V<G~N<t@-WSG;DKw2zs*8t(_0VZ zi9ew8Z>X`&h8ook9ni5On%Jo9a!h<O1D8mJ-kFI-XcB#AVH`FH*DMS*HUH-Pq#FHj z#`n!Eq)VoA4`S;s^5-C^J(UCQ$@GG7&4HsE-SaS2%=f@4DU88xsdUwdALpRAbWul< zGE!7H5$emCi(QiG@&gy@eYN$xH`<){s&>v>Ms`CzIDLJuQ_C{K@d)0PZtFyq6<x)( zh3Fr8N5_mXP)={TqZ54!Ksy#?1+a7umXV;wv0OKS2^V8`bZU`E{8)e<x?5DkqJo?l zYDL%p$Zexffcy(5Mb#eFCe#-xuYm=N$E?T=Z%^M+Cz;V7(G9^ei;yYcb`y832=24M zJ=UqHm4?X<cZNSP%5!KWMcow*+1kn=-d4~x#%5Kh0N}PMuBmE&MhT6!R*rSp2_=>) z1hPc5LQYx|Q`DDER4W(+S?pKn!~x<5l^7_J3eg`yVqPJA>BX8t3`DSKEJQDah>L~j zjdr4a5vf3^c&Lc_+6zY!#-M|Et%$s1NAYD55|_{W$%g&wYdbc`k5QMILadtQsi2*} zs=7OK>)tCDv>i%?02^J4|FoUt>Yt4zU#)fD8(c;V(-oHpFGg2%7D>ezfiPiHU*Y1F zVx%ELoG*qkJaf8Qp=lLRhSf^K=_01s5KAiIw&6*b#BCcUN>Q>}jS~wVr322-$K}o= zvhCWccOd}NiJC`AHnRA$69Y(!-#BTNK#}00uOKnkMM5Ddx{ygyJh%waDc1WqV!E=} zu}HB_R|@FfN-9~1TynqD?DY4F(RM76Vq|_{L>IB31WqYVZTAq%-JojK`ce!XJ8Z1t zbl(>ogIuOkY=t&|nqjs(>}v8txr^)FIwdpP<?<-jJclF4Vy{#=nItBb;&-GIDIO%! zX+9{$a9x0WQ%o*Jj7YNMX({pli!A#6JI?=yV9j!6Hdt1Rt-j*L_yQD+CsklP;>5ZN zOf&zATVo?t%MLvuQSCg#7g&kia&VSv^w~1Y79Af)q-d@pjmc5lC&j)h$US8J4B5zL z$PdB<5wm5#ho3Ls_pY-=|K%7;SgdF{8TMfD@^ZxXov*GoTV@2U$;Bu%v-04XZLKqx zwwc)`jMaENxKy3XCbM$imTC}C_lUty;7wGD>rY^{sp^6Ah8z4F-g<w(H8OY1jutIX z!hjXx>XV4-xDJTaN+-hz-mjLmLa|uvL<bl|`U=!_nRGYfQPtg_>{!VNt5+feYeelT zvhYt=B6ajtXgLe&aX%TvS}8oM!tJzRtxT~#fgmq6m~37rZ<II5wek+RUOphdMM;S0 z^b)!W%Twe8H~QOqo+5;?$>09=De{B0{`R0%1eMo5MR=)v72-qcWQ1lpEsWLqXfq84 zsa~e?j8T+qMEAf3b=m!5%|-&34Pq~mu-`w+mm3k?k<g@>;IKcJV+Yip;nG{OSer>| zVta`OUGzQu5<ZfV?VG;^b0t!n1GRABy6E>O?N$3HR3k(5+=c|x3}C!5MZ?zqg0#zq z6*yn~m?+qWT-_VyC~;sLCeZE4+p!NdV*hsJcVB^8$xvif7N@jkK>gGY3SBHo^xuJZ za7$d<L9lM4Xn6&*M9EId5jKezc47}2e4}^aH5I6STZbx~@RjXG1{GU<ukFF7K{()h z`gJr*wAlqda*h{#+=u;vxa`Y*8?}^?`L4W!D>}7S`@Cp*7iHKgat@<w_pNkAlcspw zMGh*r`0=F{<G{9x<%bE1Zxy=_BPv+s10=jGP9DaGw9M8cWCg*Z`3Rk^QmlNB+;o-L z{T|%98eNu%`3s7$%eVS3px>Rgi#Lu^Fsl()j>1MmXCA}Tq>>koVH-`q;;*<ydgXba z40Vlo^?ghT>Lg(g!@Bjy5lNzmI!-;Ce6x-tSPF=euum3EhtWkW`v4~F@U8m*izU>F z&?Zc$d(UqoaC$`ivk6bg(<B@gRUe@V$HbJ6krze9<`#w%y6{0W%8Hy+f1TpA71`_z zRNVbi9QqhkMiu}0F@~dA^gM;WL6s6NF+%=%r!WNP#51R8EA`^YDT+83L`X9V=~U&- zI2c4_>MINv#h_0JBi|AmKEY?WEGj-lq`X4HO|juq6l1mzr?CT}-|M17XHh9w{U;*M zB2Gn2BhF$eK_lN;ax(43wX^6Muv)^8deQZ7*esERqFP|;9GP%Gh*2a8Fqp*n7LxT= zv9AT)DAyM6x1iSq^|~@!BjC>lR8v>+FS=Y)ogTYlokFspNwwSFAt8W($n6%KU7oHE z@P|A4`NZb18VKT&ap%CCW3$^zJ*8%=$Ny7~Il*Q(+qHa?GLqJ^pLwC;UZPML&!R=% z*1$<W^$<a={ZWW^R#I2Fhkh1Cl-$Rl22S!a^bDPpD=wZR%n>8*oFg!mEk=Kik@Twh zJDEqY*!g#S9uX(^P01~_xr<%7o`v^hi}Q&6UqmJjoJZXMiM;kpX#ek#SE4*9!GCy7 zY6-cb`2yMFugI&X{Fa1Hs>mJ{?Y}?;RUlS=fuzt>*#y<X8%fc8Z-0SdYSH1pE+S5s zDyNAaUtw^_NLgh#A|b~2$X75>=|ng#QC!Fn4VSP4St9W=qUkmMGHH6EXt<2>9y#); zaIH)M|4SdKei4MGT1Wt!CNlnkgRqGI{s&>mRNq5i<4L(wxjZ^@hTB#`g<ytr5}|;T z*C<2xh;G-(+$u%QbqX6*;<f7-*J&goQ|^YWF;tkX@rB%=Ktjwzz6B@S{Oh-vi50$> z??{!qua+~`$g+9-*kXk$A`bf;#p%e^eyLd}GHxQwxluL@(>n7iW>UgTrSDC$Aw{E% zQ|yY%=Bky=evTZ<sR<yvD|g7|gu4?KDD`r6lJ?~f3J2us1!IdX&LSnxX|cO31?q2| QQ!SOHr0;LZ)eZ9h0GrOErT_o{ diff --git a/src/cache.rs b/src/cache.rs index 0a7d531..16836c5 100644 --- a/src/cache.rs +++ b/src/cache.rs @@ -1,19 +1,20 @@ +use crate::gdev_300; use crate::indexer::*; -use crate::Api; +use crate::Client; use anyhow::{anyhow, Result}; use std::collections::{hash_map, HashMap}; pub struct IdentityCache<'a> { - api: &'a Api, + client: &'a Client, identities: HashMap<u32, String>, indexer: Option<(&'a reqwest::Client, &'a str)>, } impl<'a> IdentityCache<'a> { - pub fn new(api: &'a Api, indexer: Option<(&'a reqwest::Client, &'a str)>) -> Self { + pub fn new(client: &'a Client, indexer: Option<(&'a reqwest::Client, &'a str)>) -> Self { Self { - api, + client, identities: HashMap::new(), indexer, } @@ -29,10 +30,12 @@ impl<'a> IdentityCache<'a> { hash_map::Entry::Vacant(entry) => entry .insert({ let pubkey = self - .api + .client .storage() - .identity() - .identities(&identity_id, Some(parent_hash)) + .fetch( + &gdev_300::storage().identity().identities(identity_id), + Some(parent_hash), + ) .await? .ok_or_else(|| anyhow!("Identity {} not found", identity_id))? .owner_key diff --git a/src/main.rs b/src/main.rs index d5ca0e3..a177c96 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ mod cache; mod indexer; -use anyhow::{anyhow, Context, Result}; +use anyhow::{anyhow, Result}; use clap::Parser; use codec::Encode; use sp_core::{ @@ -10,17 +10,30 @@ use sp_core::{ }; use std::collections::BTreeMap; use std::str::FromStr; -use subxt::sp_runtime::MultiAddress; -use subxt::{ - extrinsic::{BaseExtrinsicParams, BaseExtrinsicParamsBuilder}, - ClientBuilder, DefaultConfig, PairSigner, -}; +use subxt::ext::sp_runtime::MultiAddress; +use subxt::tx::{BaseExtrinsicParamsBuilder, PairSigner}; #[subxt::subxt(runtime_metadata_path = "res/metadata.scale")] pub mod gdev_300 {} -pub type Api = gdev_300::RuntimeApi<DefaultConfig, BaseExtrinsicParams<DefaultConfig, Tip>>; -type Client = subxt::Client<DefaultConfig>; +pub type Client = subxt::OnlineClient<GdevConfig>; + +pub enum GdevConfig {} +impl subxt::config::Config for GdevConfig { + type Index = u32; + type BlockNumber = u32; + type Hash = sp_core::H256; + type Hashing = subxt::ext::sp_runtime::traits::BlakeTwo256; + type AccountId = subxt::ext::sp_runtime::AccountId32; + type Address = subxt::ext::sp_runtime::MultiAddress<Self::AccountId, u32>; + type Header = subxt::ext::sp_runtime::generic::Header< + Self::BlockNumber, + subxt::ext::sp_runtime::traits::BlakeTwo256, + >; + type Signature = subxt::ext::sp_runtime::MultiSignature; + type Extrinsic = subxt::ext::sp_runtime::OpaqueExtrinsic; + type ExtrinsicParams = subxt::tx::BaseExtrinsicParams<Self, Tip>; +} #[derive(Copy, Clone, Debug, Default, Encode)] pub struct Tip { @@ -150,19 +163,18 @@ async fn main() -> Result<()> { (None, None) => (None, None), }; - let client: Client = ClientBuilder::new() - .set_url(&args.url) - .build() - .await - .with_context(|| "fail to connect to node")?; - let api = client.clone().to_runtime_api::<Api>(); + let client = Client::new().await.unwrap(); let gql_client = reqwest::Client::builder() .user_agent("gcli/0.1.0") .build()?; if let Some(account_id) = &account_id { - let account = api.storage().system().account(account_id, None).await?; + let account = client + .storage() + .fetch(&gdev_300::storage().system().account(account_id), None) + .await? + .expect("Cannot fetch account"); logs::info!("Account free balance: {}", account.data.free); } @@ -170,10 +182,12 @@ async fn main() -> Result<()> { Subcommand::CreateOneshot { balance, dest } => { let pair = pair.expect("This subcommand needs a secret."); - api.tx() - .oneshot_account() - .create_oneshot_account(dest.into(), balance)? + client + .tx() .sign_and_submit_then_watch( + &gdev_300::tx() + .oneshot_account() + .create_oneshot_account(dest.into(), balance), &PairSigner::new(pair), BaseExtrinsicParamsBuilder::new(), ) @@ -182,8 +196,13 @@ async fn main() -> Result<()> { Subcommand::ConsumeOneshot { dest, dest_oneshot } => { let pair = pair.expect("This subcommand needs a secret."); - let number = api.storage().system().number(None).await?; - api.tx() + let number = client + .storage() + .fetch(&gdev_300::storage().system().number(), None) + .await? + .unwrap(); + client.tx() + .sign_and_submit_then_watch(&gdev_300::tx() .oneshot_account() .consume_oneshot_account( number, @@ -196,8 +215,7 @@ async fn main() -> Result<()> { dest.into(), ) }, - )? - .sign_and_submit_then_watch( + ), &PairSigner::new(pair), BaseExtrinsicParamsBuilder::new(), ) @@ -212,8 +230,13 @@ async fn main() -> Result<()> { } => { let pair = pair.expect("This subcommand needs a secret."); - let number = api.storage().system().number(None).await?; - api.tx() + let number = client + .storage() + .fetch(&gdev_300::storage().system().number(), None) + .await? + .unwrap(); + client.tx() + .sign_and_submit_then_watch(&gdev_300::tx() .oneshot_account() .consume_oneshot_account_with_remaining( number, @@ -236,26 +259,36 @@ async fn main() -> Result<()> { ) }, balance, - )? - .sign_and_submit_then_watch( + ), &PairSigner::new(pair), BaseExtrinsicParamsBuilder::new(), ) .await?; } Subcommand::Expire { blocks, sessions } => { - let parent_hash = api.storage().system().parent_hash(None).await?; - let current_block = api.storage().system().number(Some(parent_hash)).await?; - let current_session = api + let parent_hash = client .storage() - .session() - .current_index(Some(parent_hash)) - .await?; + .fetch(&gdev_300::storage().system().parent_hash(), None) + .await? + .unwrap(); + let current_block = client + .storage() + .fetch(&gdev_300::storage().system().number(), Some(parent_hash)) + .await? + .unwrap(); + let current_session = client + .storage() + .fetch( + &gdev_300::storage().session().current_index(), + Some(parent_hash), + ) + .await? + .unwrap(); let end_block = current_block + blocks; let end_session = current_session + sessions; let mut identity_cache = cache::IdentityCache::new( - &api, + &client, if args.no_indexer { None } else { @@ -266,9 +299,13 @@ async fn main() -> Result<()> { // Rotate keys let mut must_rotate_keys_before_iter = client .storage() - .iter::<gdev_300::authority_members::storage::MustRotateKeysBefore>(Some( - parent_hash, - )) + .iter( + gdev_300::storage() + .authority_members() + .must_rotate_keys_before(0), + 10, + Some(parent_hash), + ) .await?; let mut must_rotate_keys_before = BTreeMap::new(); while let Some((k, v)) = must_rotate_keys_before_iter.next().await? { @@ -296,7 +333,11 @@ async fn main() -> Result<()> { // Certifications let mut basic_certs_iter = client .storage() - .iter::<gdev_300::cert::storage::StorageCertsRemovableOn>(Some(parent_hash)) + .iter( + gdev_300::storage().cert().storage_certs_removable_on(0), + 10, + Some(parent_hash), + ) .await?; let mut basic_certs = BTreeMap::new(); while let Some((k, v)) = basic_certs_iter.next().await? { @@ -308,7 +349,13 @@ async fn main() -> Result<()> { let mut smith_certs_iter = client .storage() - .iter::<gdev_300::smiths_cert::storage::StorageCertsRemovableOn>(Some(parent_hash)) + .iter( + gdev_300::storage() + .smiths_cert() + .storage_certs_removable_on(0), + 10, + Some(parent_hash), + ) .await?; let mut smith_certs = BTreeMap::new(); while let Some((k, v)) = smith_certs_iter.next().await? { @@ -346,7 +393,11 @@ async fn main() -> Result<()> { // Memberships let mut basic_membership_iter = client .storage() - .iter::<gdev_300::membership::storage::MembershipsExpireOn>(Some(parent_hash)) + .iter( + gdev_300::storage().membership().memberships_expire_on(0), + 10, + Some(parent_hash), + ) .await?; let mut basic_memberships = BTreeMap::new(); while let Some((k, v)) = basic_membership_iter.next().await? { @@ -358,9 +409,13 @@ async fn main() -> Result<()> { let mut smith_membership_iter = client .storage() - .iter::<gdev_300::smiths_membership::storage::MembershipsExpireOn>(Some( - parent_hash, - )) + .iter( + gdev_300::storage() + .smiths_membership() + .memberships_expire_on(0), + 10, + Some(parent_hash), + ) .await?; let mut smith_memberships = BTreeMap::new(); while let Some((k, v)) = smith_membership_iter.next().await? { @@ -391,14 +446,19 @@ async fn main() -> Result<()> { } } Subcommand::GenRevocDoc => { - gen_revoc_doc(&api, &pair.expect("This subcommand needs a secret.")).await? + gen_revoc_doc(&client, &pair.expect("This subcommand needs a secret.")).await? } Subcommand::OneshotBalance { account } => { logs::info!( "{}", - api.storage() - .oneshot_account() - .oneshot_accounts(&account, None) + client + .storage() + .fetch( + &gdev_300::storage() + .oneshot_account() + .oneshot_accounts(&account), + None + ) .await? .unwrap_or(0) ); @@ -429,19 +489,25 @@ async fn main() -> Result<()> { .await?; signer.increment_nonce();*/ - let pair_i_account = api + if let Some(pair_i_account) = client .storage() - .system() - .account(&pair_i.public().into(), None) - .await?; - logs::info!("account //{} balance: {}", i, pair_i_account.data.free); + .fetch( + &gdev_300::storage() + .system() + .account(&pair_i.public().into()), + None, + ) + .await? + { + logs::info!("account //{} balance: {}", i, pair_i_account.data.free); + } } } Subcommand::SpamRoll { actual_repart } => { let pair = pair.expect("This subcommand needs a secret."); let mut pairs = - Vec::<(PairSigner<DefaultConfig, Pair>, AccountId32)>::with_capacity(actual_repart); + Vec::<(PairSigner<GdevConfig, Pair>, AccountId32)>::with_capacity(actual_repart); for i in 0..actual_repart { let pair_i = pair .derive(std::iter::once(DeriveJunction::hard::<u32>(i as u32)), None) @@ -455,22 +521,27 @@ async fn main() -> Result<()> { let mut watchers = Vec::with_capacity(actual_repart); for i in 0..(actual_repart - 1) { let dest: AccountId32 = pairs[i + 1].1.clone(); - let watcher = api + let watcher = client .tx() - .balances() - .transfer(MultiAddress::Id(dest), 1)? - .sign_and_submit_then_watch(&pairs[i].0, BaseExtrinsicParamsBuilder::new()) + .sign_and_submit_then_watch( + &gdev_300::tx() + .balances() + .transfer(MultiAddress::Id(dest), 1), + &pairs[i].0, + BaseExtrinsicParamsBuilder::new(), + ) .await?; pairs[i].0.increment_nonce(); logs::info!("send 1 cent from //{} to //{}", i, i + 1); watchers.push(watcher); } let dest: AccountId32 = pairs[0].1.clone(); - let watcher = api + let watcher = client .tx() - .balances() - .transfer(MultiAddress::Id(dest), 1)? .sign_and_submit_then_watch( + &gdev_300::tx() + .balances() + .transfer(MultiAddress::Id(dest), 1), &pairs[actual_repart - 1].0, BaseExtrinsicParamsBuilder::new(), ) @@ -493,19 +564,21 @@ async fn main() -> Result<()> { let pair = pair.expect("This subcommand needs a secret."); if keep_alive { - api.tx() - .balances() - .transfer(dest.into(), balance)? + client + .tx() .sign_and_submit_then_watch( + &gdev_300::tx().balances().transfer(dest.into(), balance), &PairSigner::new(pair), BaseExtrinsicParamsBuilder::new(), ) .await?; } else { - api.tx() - .balances() - .transfer_keep_alive(dest.into(), balance)? + client + .tx() .sign_and_submit_then_watch( + &gdev_300::tx() + .balances() + .transfer_keep_alive(dest.into(), balance), &PairSigner::new(pair), BaseExtrinsicParamsBuilder::new(), ) @@ -517,14 +590,26 @@ async fn main() -> Result<()> { Ok(()) } -async fn gen_revoc_doc(api: &Api, pair: &Pair) -> Result<()> { +async fn gen_revoc_doc(api: &Client, pair: &Pair) -> Result<()> { let account_id: sp_core::crypto::AccountId32 = pair.public().into(); - let genesis_hash = api.storage().system().block_hash(&0, None).await?; - let payload = (account_id, genesis_hash).encode(); + let idty_index = api + .storage() + .fetch( + &gdev_300::storage() + .identity() + .identity_index_of(&account_id), + None, + ) + .await?; + let genesis_hash = api + .storage() + .fetch(&gdev_300::storage().system().block_hash(0), None) + .await? + .unwrap(); + let payload = (b"revo", genesis_hash, idty_index).encode(); let signature = pair.sign(&payload); - println!("payload: 0x{}", hex::encode(payload)); - println!("signature: 0x{}", hex::encode(signature)); + println!("0x{}", hex::encode(signature)); Ok(()) } -- GitLab