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
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
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