From 31d28882078961536462f5b251cccda8efb9b1ed Mon Sep 17 00:00:00 2001 From: Muhamad Awad Date: Thu, 13 Apr 2023 15:43:04 +0200 Subject: [PATCH] Update subxt (#673) * wip * Wip: update subxt and also drop other runtimes Note, this can be cleaned up more * rename devnet to current --- clients/tfchain_client_rs/Cargo.lock | 1237 +++++++++++------ clients/tfchain_client_rs/Cargo.toml | 8 +- .../artifacts/{devnet.scale => current.scale} | Bin .../tfchain_client_rs/artifacts/local.scale | Bin 100718 -> 0 bytes .../tfchain_client_rs/artifacts/mainnet.scale | Bin 100554 -> 0 bytes .../tfchain_client_rs/artifacts/testnet.scale | Bin 100438 -> 0 bytes clients/tfchain_client_rs/src/client.rs | 139 +- clients/tfchain_client_rs/src/main.rs | 142 -- .../src/runtimes/{devnet.rs => current.rs} | 118 +- .../tfchain_client_rs/src/runtimes/local.rs | 216 --- .../tfchain_client_rs/src/runtimes/mainnet.rs | 219 --- clients/tfchain_client_rs/src/runtimes/mod.rs | 6 +- .../tfchain_client_rs/src/runtimes/testnet.rs | 217 --- .../tfchain_client_rs/src/runtimes/types.rs | 1169 ---------------- 14 files changed, 939 insertions(+), 2532 deletions(-) rename clients/tfchain_client_rs/artifacts/{devnet.scale => current.scale} (100%) delete mode 100644 clients/tfchain_client_rs/artifacts/local.scale delete mode 100644 clients/tfchain_client_rs/artifacts/mainnet.scale delete mode 100644 clients/tfchain_client_rs/artifacts/testnet.scale delete mode 100644 clients/tfchain_client_rs/src/main.rs rename clients/tfchain_client_rs/src/runtimes/{devnet.rs => current.rs} (51%) delete mode 100644 clients/tfchain_client_rs/src/runtimes/local.rs delete mode 100644 clients/tfchain_client_rs/src/runtimes/mainnet.rs delete mode 100644 clients/tfchain_client_rs/src/runtimes/testnet.rs delete mode 100644 clients/tfchain_client_rs/src/runtimes/types.rs diff --git a/clients/tfchain_client_rs/Cargo.lock b/clients/tfchain_client_rs/Cargo.lock index 875a5443f..500ced697 100644 --- a/clients/tfchain_client_rs/Cargo.lock +++ b/clients/tfchain_client_rs/Cargo.lock @@ -47,6 +47,18 @@ dependencies = [ "version_check", ] +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "getrandom 0.2.8", + "once_cell", + "version_check", +] + [[package]] name = "aho-corasick" version = "0.7.20" @@ -131,7 +143,7 @@ checksum = "705339e0e4a9690e2908d2b3d049d85682cf19fbd5782494498fbf7003a6a282" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -230,6 +242,17 @@ dependencies = [ "digest 0.10.6", ] +[[package]] +name = "blake2b_simd" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" +dependencies = [ + "arrayref", + "arrayvec 0.7.2", + "constant_time_eq", +] + [[package]] name = "block-buffer" version = "0.7.3" @@ -269,6 +292,24 @@ dependencies = [ "byte-tools", ] +[[package]] +name = "bounded-collections" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a071c348a5ef6da1d3a87166b408170b46002382b1dda83992b5c2208cefb370" +dependencies = [ + "log", + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + [[package]] name = "bumpalo" version = "3.11.1" @@ -348,6 +389,12 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cec318a675afcb6a1ea1d4340e2d377e56e47c266f28043ceccbf4412ddfdd3b" +[[package]] +name = "constant_time_eq" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13418e745008f7349ec7e449155f419a61b92b58a99cc3616942b926825ec76b" + [[package]] name = "core-foundation" version = "0.9.3" @@ -391,6 +438,15 @@ dependencies = [ "serde", ] +[[package]] +name = "cranelift-entity" +version = "0.93.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cf583f7b093f291005f9fb1323e2c37f6ee4c7909e39ce016b2e8360d461705" +dependencies = [ + "serde", +] + [[package]] name = "crc32fast" version = "1.3.2" @@ -498,7 +554,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn", + "syn 1.0.109", ] [[package]] @@ -515,7 +571,7 @@ checksum = "39e61fda7e62115119469c7b3591fd913ecca96fb766cfd3f2e2502ab7bc87a5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -539,7 +595,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 1.0.109", ] [[package]] @@ -550,7 +606,7 @@ checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ "darling_core", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -571,7 +627,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -582,7 +638,7 @@ checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -638,7 +694,7 @@ checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -687,7 +743,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" dependencies = [ "curve25519-dalek 3.2.0", - "hashbrown", + "hashbrown 0.12.3", "hex", "rand_core 0.6.4", "sha2 0.9.9", @@ -696,9 +752,9 @@ dependencies = [ [[package]] name = "either" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "elliptic-curve" @@ -736,6 +792,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "errno-dragonfly" version = "0.1.2" @@ -801,6 +868,15 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + [[package]] name = "frame-benchmarking" version = "10.0.0" @@ -882,7 +958,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -895,7 +971,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -906,7 +982,7 @@ checksum = "6a881492b8dfdd6065d7d8537b8f79cd27aff8c501c759ac12b0295d139ff3d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1006,7 +1082,7 @@ checksum = "3eb14ed937631bd8b8b8977f2c198443447a8355b6e3ca599f38c975e5a963b6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1071,10 +1147,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.9.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] @@ -1142,6 +1216,12 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" +[[package]] +name = "hash-db" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e7d7786361d7425ae2fe4f9e407eb0efaa0840f5212d109cc018c40c35c6ab4" + [[package]] name = "hash256-std-hasher" version = "0.15.2" @@ -1157,7 +1237,16 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash", + "ahash 0.7.6", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.3", ] [[package]] @@ -1175,6 +1264,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "hex" version = "0.4.3" @@ -1325,6 +1420,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "impl-codec" version = "0.6.0" @@ -1351,7 +1456,7 @@ checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1361,7 +1466,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", "serde", ] @@ -1389,6 +1494,17 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59ce5ef949d49ee85593fc4d3f3f95ad61657076395cbbce23e2121fc5542074" +[[package]] +name = "io-lifetimes" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -1614,6 +1730,18 @@ version = "0.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d" +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + +[[package]] +name = "linux-raw-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" + [[package]] name = "lock_api" version = "0.4.9" @@ -1639,7 +1767,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" dependencies = [ - "hashbrown", + "hashbrown 0.12.3", ] [[package]] @@ -1675,6 +1803,15 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "memfd" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc89ccdc6e10d6907450f753537ebc5c5d3460d2e4e62ea74bd571db62c0f9e" +dependencies = [ + "rustix 0.37.3", +] + [[package]] name = "memoffset" version = "0.6.5" @@ -1686,23 +1823,21 @@ dependencies = [ [[package]] name = "memory-db" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac11bb793c28fa095b7554466f53b3a60a2cd002afdac01bcf135cbd73a269" +checksum = "5e0c7cba9ce19ac7ffd2053ac9f49843bbd3f4318feedfd74e85c19d5fb0ba66" dependencies = [ - "hash-db", - "hashbrown", - "parity-util-mem", + "hash-db 0.15.2", + "hashbrown 0.12.3", ] [[package]] name = "memory-db" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e0c7cba9ce19ac7ffd2053ac9f49843bbd3f4318feedfd74e85c19d5fb0ba66" +checksum = "808b50db46293432a45e63bc15ea51e0ab4c0a1647b8eb114e31a3e698dd6fbe" dependencies = [ - "hash-db", - "hashbrown", + "hash-db 0.16.0", ] [[package]] @@ -1770,7 +1905,7 @@ checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1857,7 +1992,7 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi", + "hermit-abi 0.2.6", "libc", ] @@ -1868,7 +2003,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" dependencies = [ "crc32fast", - "hashbrown", + "hashbrown 0.12.3", "indexmap", "memchr", ] @@ -1952,33 +2087,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "parity-util-mem" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d32c34f4f5ca7f9196001c0aba5a1f9a5a12382c8944b8b0f90233282d1e8f8" -dependencies = [ - "cfg-if", - "hashbrown", - "impl-trait-for-tuples", - "parity-util-mem-derive", - "parking_lot", - "primitive-types", - "winapi", -] - -[[package]] -name = "parity-util-mem-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" -dependencies = [ - "proc-macro2", - "syn", - "synstructure", + "syn 1.0.109", ] [[package]] @@ -2022,15 +2131,6 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" -[[package]] -name = "pbkdf2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" -dependencies = [ - "crypto-mac 0.8.0", -] - [[package]] name = "pbkdf2" version = "0.8.0" @@ -2049,6 +2149,12 @@ dependencies = [ "digest 0.10.6", ] +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + [[package]] name = "pin-project" version = "1.0.12" @@ -2066,7 +2172,7 @@ checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2130,7 +2236,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -2147,9 +2253,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.53" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba466839c78239c09faf015484e5cc04860f88242cff4d03eb038f04b4699b73" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ "unicode-ident", ] @@ -2165,9 +2271,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" dependencies = [ "proc-macro2", ] @@ -2189,7 +2295,6 @@ dependencies = [ "rand_chacha 0.2.2", "rand_core 0.5.1", "rand_hc", - "rand_pcg", ] [[package]] @@ -2260,15 +2365,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rand_pcg" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" -dependencies = [ - "rand_core 0.5.1", -] - [[package]] name = "rawpointer" version = "0.2.1" @@ -2301,7 +2397,7 @@ checksum = "9f9c0c92af03644e4806106281fe2e068ac5bc0ae74a707266d06ea27bccee5f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2381,13 +2477,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "727a1a6d65f786ec22df8a81ca3121107f235970dc1705ed681d3e6e8b9cd5f9" dependencies = [ "bitflags", - "errno", - "io-lifetimes", + "errno 0.2.8", + "io-lifetimes 0.7.5", "libc", - "linux-raw-sys", + "linux-raw-sys 0.0.46", "windows-sys 0.42.0", ] +[[package]] +name = "rustix" +version = "0.36.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0af200a3324fa5bcd922e84e9b55a298ea9f431a489f01961acdebc6e908f25" +dependencies = [ + "bitflags", + "errno 0.3.1", + "io-lifetimes 1.0.10", + "libc", + "linux-raw-sys 0.1.4", + "windows-sys 0.45.0", +] + +[[package]] +name = "rustix" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b24138615de35e32031d041a09032ef3487a616d901ca4db224e7d557efae2" +dependencies = [ + "bitflags", + "errno 0.3.1", + "io-lifetimes 1.0.10", + "libc", + "linux-raw-sys 0.3.1", + "windows-sys 0.45.0", +] + [[package]] name = "rustls" version = "0.20.7" @@ -2421,6 +2545,12 @@ dependencies = [ "base64 0.21.0", ] +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" + [[package]] name = "ryu" version = "1.0.12" @@ -2440,21 +2570,63 @@ dependencies = [ [[package]] name = "scale-decode" -version = "0.4.0" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e5527e4b3bf079d4c0b2f253418598c380722ba37ef20fac9088081407f2b6" +dependencies = [ + "parity-scale-codec", + "primitive-types", + "scale-bits", + "scale-decode-derive", + "scale-info", + "thiserror", +] + +[[package]] +name = "scale-decode-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b38741b2f78e4391b94eac6b102af0f6ea2b0f7fe65adb55d7f4004f507854db" +dependencies = [ + "darling", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "scale-encode" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d823d4be477fc33321f93d08fb6c2698273d044f01362dc27573a750deb7c233" +checksum = "15546e5efbb45f0fc2291f7e202dee8623274c5d8bbfdf9c6886cc8b44a7ced3" dependencies = [ "parity-scale-codec", + "primitive-types", "scale-bits", + "scale-encode-derive", "scale-info", "thiserror", ] +[[package]] +name = "scale-encode-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd983cf0a9effd76138554ead18a6de542d1af175ac12fd5e91836c5c0268082" +dependencies = [ + "darling", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "scale-info" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "001cf62ece89779fd16105b5f515ad0e5cedcd5440d3dd806bb067978e7c3608" +checksum = "0cfdffd972d76b22f3d7f81c8be34b2296afd3a25e0a547bd9abe340a4dbbe97" dependencies = [ "bitvec", "cfg-if", @@ -2466,27 +2638,28 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "303959cf613a6f6efd19ed4b4ad5bf79966a13352716299ad532cfb115f4205c" +checksum = "61fa974aea2d63dd18a4ec3a49d59af9f34178c73a4f56d2f18205628d00681e" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "scale-value" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a5e7810815bd295da73e4216d1dfbced3c7c7c7054d70fa5f6e4c58123fff4" +checksum = "11f549769261561e6764218f847e500588f9a79a289de49ce92f9e26642a3574" dependencies = [ "either", "frame-metadata", "parity-scale-codec", "scale-bits", "scale-decode", + "scale-encode", "scale-info", "serde", "thiserror", @@ -2502,6 +2675,17 @@ dependencies = [ "windows-sys 0.42.0", ] +[[package]] +name = "schnellru" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" +dependencies = [ + "ahash 0.8.3", + "cfg-if", + "hashbrown 0.13.2", +] + [[package]] name = "schnorrkel" version = "0.9.1" @@ -2608,29 +2792,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.152" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.152" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.14", ] [[package]] name = "serde_json" -version = "1.0.94" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa", "ryu", @@ -2744,9 +2928,9 @@ checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "socket2" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ "libc", "winapi", @@ -2773,7 +2957,7 @@ version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bc6e71a70a5bd94a620be6c2351af41b659b015fdb2b1d252c98f5eae74d52d" dependencies = [ - "hash-db", + "hash-db 0.15.2", "log", "parity-scale-codec", "sp-api-proc-macro", @@ -2796,128 +2980,125 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "sp-application-crypto" -version = "7.0.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a70f8245ad75c773c43e46d16e81adb62290d37cd07efcde6cef06d93235e5" +checksum = "a72575f160b1b134ee277a2ab46af4361c072a3fe661c48e474255406cb01c97" dependencies = [ "parity-scale-codec", "scale-info", "serde", - "sp-core 7.0.0", - "sp-io 7.0.0", - "sp-std 5.0.0", + "sp-core 11.0.0", + "sp-io 12.0.0", + "sp-std 6.0.0", ] [[package]] name = "sp-application-crypto" -version = "12.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a72575f160b1b134ee277a2ab46af4361c072a3fe661c48e474255406cb01c97" +checksum = "8cf23435a4bbd6eeec2bbbc346719ba4f3200e0ddb5f9e9f06c1724db03a8410" dependencies = [ "parity-scale-codec", "scale-info", "serde", - "sp-core 11.0.0", - "sp-io 12.0.0", - "sp-std 6.0.0", + "sp-core 20.0.0", + "sp-io 22.0.0", + "sp-std 7.0.0", ] [[package]] name = "sp-arithmetic" -version = "6.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3856b3e912f0a7a1332f1642b5fd3c2e76476e894c656538d32c004698690157" +checksum = "2038010f7514d50775dcbd3edb569e17fa9bda63128580a9e172abb1795f2c1d" dependencies = [ "integer-sqrt", "num-traits", "parity-scale-codec", "scale-info", "serde", - "sp-debug-derive 5.0.0", - "sp-std 5.0.0", + "sp-std 6.0.0", "static_assertions", ] [[package]] name = "sp-arithmetic" -version = "9.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2038010f7514d50775dcbd3edb569e17fa9bda63128580a9e172abb1795f2c1d" +checksum = "2c3d3507a803e8bc332fa290ed3015a7b51d4436ce2b836744642fc412040456" dependencies = [ "integer-sqrt", "num-traits", "parity-scale-codec", "scale-info", "serde", - "sp-std 6.0.0", + "sp-std 7.0.0", "static_assertions", ] [[package]] name = "sp-core" -version = "7.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c78530907dbf7949af928d0ce88b485067389201b6d9b468074b1924f209f0" +checksum = "d99984f57c9eb858d29fbe0e4cf44092eec484b2ff72176d5afa4ab7bf1dc8b1" dependencies = [ "array-bytes", "base58", "bitflags", "blake2", - "byteorder", "dyn-clonable", "ed25519-zebra", "futures", - "hash-db", + "hash-db 0.15.2", "hash256-std-hasher", "impl-serde", "lazy_static", "libsecp256k1", "log", "merlin", - "num-traits", "parity-scale-codec", "parking_lot", "primitive-types", - "rand 0.7.3", + "rand 0.8.5", "regex", "scale-info", "schnorrkel", "secp256k1", "secrecy", "serde", - "sp-core-hashing 5.0.0", - "sp-debug-derive 5.0.0", - "sp-externalities 0.13.0", - "sp-runtime-interface 7.0.0", - "sp-std 5.0.0", - "sp-storage 7.0.0", + "sp-core-hashing 6.0.0", + "sp-debug-derive 6.0.0", + "sp-externalities 0.15.0", + "sp-runtime-interface 10.0.0", + "sp-std 6.0.0", + "sp-storage 9.0.0", "ss58-registry", "substrate-bip39", "thiserror", - "tiny-bip39 0.8.2", - "wasmi", + "tiny-bip39", "zeroize", ] [[package]] name = "sp-core" -version = "11.0.0" +version = "20.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d99984f57c9eb858d29fbe0e4cf44092eec484b2ff72176d5afa4ab7bf1dc8b1" +checksum = "7789372146f8ad40d0b40fad0596cb1db5771187a258eabe19b06f00767fcbd6" dependencies = [ "array-bytes", - "base58", "bitflags", "blake2", + "bounded-collections", + "bs58", "dyn-clonable", "ed25519-zebra", "futures", - "hash-db", + "hash-db 0.16.0", "hash256-std-hasher", "impl-serde", "lazy_static", @@ -2934,46 +3115,46 @@ dependencies = [ "secp256k1", "secrecy", "serde", - "sp-core-hashing 6.0.0", - "sp-debug-derive 6.0.0", - "sp-externalities 0.15.0", - "sp-runtime-interface 10.0.0", - "sp-std 6.0.0", - "sp-storage 9.0.0", + "sp-core-hashing 8.0.0", + "sp-debug-derive 7.0.0", + "sp-externalities 0.18.0", + "sp-runtime-interface 16.0.0", + "sp-std 7.0.0", + "sp-storage 12.0.0", "ss58-registry", "substrate-bip39", "thiserror", - "tiny-bip39 1.0.0", + "tiny-bip39", "zeroize", ] [[package]] name = "sp-core-hashing" -version = "5.0.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b9d1daa6aebfc144729b630885e91df92ff00560490ec065a56cb538e8895a" +checksum = "cbc2d1947252b7a4e403b0a260f596920443742791765ec111daa2bbf98eff25" dependencies = [ "blake2", "byteorder", "digest 0.10.6", "sha2 0.10.6", "sha3", - "sp-std 5.0.0", + "sp-std 6.0.0", "twox-hash", ] [[package]] name = "sp-core-hashing" -version = "6.0.0" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc2d1947252b7a4e403b0a260f596920443742791765ec111daa2bbf98eff25" +checksum = "27449abdfbe41b473e625bce8113745e81d65777dd1d5a8462cf24137930dad8" dependencies = [ - "blake2", + "blake2b_simd", "byteorder", "digest 0.10.6", "sha2 0.10.6", "sha3", - "sp-std 6.0.0", + "sp-std 7.0.0", "twox-hash", ] @@ -2986,53 +3167,53 @@ dependencies = [ "proc-macro2", "quote", "sp-core-hashing 6.0.0", - "syn", + "syn 1.0.109", ] [[package]] name = "sp-debug-derive" -version = "5.0.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9ba7352773b96a4aa57e903447f841c6bc26e8c798377db6e7eb332346454" +checksum = "66fb9dc63d54de7d7bed62a505b6e0bd66c122525ea1abb348f6564717c3df2d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "sp-debug-derive" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66fb9dc63d54de7d7bed62a505b6e0bd66c122525ea1abb348f6564717c3df2d" +checksum = "62211eed9ef9dac4b9d837c56ccc9f8ee4fc49d9d9b7e6b9daf098fe173389ab" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "sp-externalities" -version = "0.13.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef739442230f49d88ece41259e5d886d6b8bc0f4197ef7f1585c39c762ce7ef2" +checksum = "dc754e1cec66b93df0b48a8986d019c1a2a90431c42cf2614cc35a291597c329" dependencies = [ "environmental", "parity-scale-codec", - "sp-std 5.0.0", - "sp-storage 7.0.0", + "sp-std 6.0.0", + "sp-storage 9.0.0", ] [[package]] name = "sp-externalities" -version = "0.15.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc754e1cec66b93df0b48a8986d019c1a2a90431c42cf2614cc35a291597c329" +checksum = "8ae0f275760689aaefe967943331d458cd99f5169d18364365d4cb584b246d1c" dependencies = [ "environmental", "parity-scale-codec", - "sp-std 6.0.0", - "sp-storage 9.0.0", + "sp-std 7.0.0", + "sp-storage 12.0.0", ] [[package]] @@ -3052,36 +3233,35 @@ dependencies = [ [[package]] name = "sp-io" -version = "7.0.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6280bd3643354f7ff0b2abd36c687745455779231a7a86d90945608f0d4924c4" +checksum = "8ac917b37c7733e3778e7ffc3958f1181a151ac3b14116d65fb10fe7b08db10e" dependencies = [ "bytes", + "ed25519", + "ed25519-dalek", "futures", - "hash-db", "libsecp256k1", "log", "parity-scale-codec", - "parking_lot", "secp256k1", - "sp-core 7.0.0", - "sp-externalities 0.13.0", - "sp-keystore 0.13.0", - "sp-runtime-interface 7.0.0", - "sp-state-machine 0.13.0", - "sp-std 5.0.0", - "sp-tracing 6.0.0", - "sp-trie 7.0.0", - "sp-wasm-interface 7.0.0", + "sp-core 11.0.0", + "sp-externalities 0.15.0", + "sp-keystore 0.17.0", + "sp-runtime-interface 10.0.0", + "sp-state-machine 0.17.0", + "sp-std 6.0.0", + "sp-tracing 7.0.0", + "sp-trie 11.0.0", "tracing", "tracing-core", ] [[package]] name = "sp-io" -version = "12.0.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ac917b37c7733e3778e7ffc3958f1181a151ac3b14116d65fb10fe7b08db10e" +checksum = "bd3431c245992fe51b8256c838fc2e981f8d3b0afc1d1377ca7dbe0a3287a764" dependencies = [ "bytes", "ed25519", @@ -3090,24 +3270,25 @@ dependencies = [ "libsecp256k1", "log", "parity-scale-codec", + "rustversion", "secp256k1", - "sp-core 11.0.0", - "sp-externalities 0.15.0", - "sp-keystore 0.17.0", - "sp-runtime-interface 10.0.0", - "sp-state-machine 0.17.0", - "sp-std 6.0.0", - "sp-tracing 7.0.0", - "sp-trie 11.0.0", + "sp-core 20.0.0", + "sp-externalities 0.18.0", + "sp-keystore 0.26.0", + "sp-runtime-interface 16.0.0", + "sp-state-machine 0.27.0", + "sp-std 7.0.0", + "sp-tracing 9.0.0", + "sp-trie 21.0.0", "tracing", "tracing-core", ] [[package]] name = "sp-keystore" -version = "0.13.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44bec4f0d036b6993c14bbee4216781f21275e5c201e43e45fed4a434bf0e5a" +checksum = "6ada8b7a72404bda58b3353830bc42f027ec764e13a28b4cd4386cf34fb1ae7c" dependencies = [ "async-trait", "futures", @@ -3115,33 +3296,32 @@ dependencies = [ "parity-scale-codec", "parking_lot", "schnorrkel", - "sp-core 7.0.0", - "sp-externalities 0.13.0", + "sp-core 11.0.0", + "sp-externalities 0.15.0", "thiserror", ] [[package]] name = "sp-keystore" -version = "0.17.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ada8b7a72404bda58b3353830bc42f027ec764e13a28b4cd4386cf34fb1ae7c" +checksum = "452d079f592c97369c9ca8a5083b25f146751c6b5af10cbcacc2b24dc53fd72a" dependencies = [ - "async-trait", "futures", "merlin", "parity-scale-codec", "parking_lot", "schnorrkel", - "sp-core 11.0.0", - "sp-externalities 0.15.0", + "sp-core 20.0.0", + "sp-externalities 0.18.0", "thiserror", ] [[package]] name = "sp-panic-handler" -version = "5.0.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97549ec99cb289db2a9f5c656b6880f7c90097135e1ca6c6ae4fe5694232e526" +checksum = "4abed79c3d5b3622f65ab065676addd9923b9b122cd257df23e2757ce487c6d2" dependencies = [ "backtrace", "lazy_static", @@ -3150,9 +3330,9 @@ dependencies = [ [[package]] name = "sp-panic-handler" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4abed79c3d5b3622f65ab065676addd9923b9b122cd257df23e2757ce487c6d2" +checksum = "75986cc917d897e0f6d0c848088064df4c74ccbb8f1c1848700b725f5ca7fe04" dependencies = [ "backtrace", "lazy_static", @@ -3161,33 +3341,32 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "7.0.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0edfc5c54c2b31d2f0cf904d472a0bff7125c0c2a2e2330507842e56f9a27444" +checksum = "c86578c67b060a6ecab52af64f1cf18b3892fca7fba5ffc5c49934b2e76b1929" dependencies = [ "either", "hash256-std-hasher", "impl-trait-for-tuples", "log", "parity-scale-codec", - "parity-util-mem", "paste", - "rand 0.7.3", + "rand 0.8.5", "scale-info", "serde", - "sp-application-crypto 7.0.0", - "sp-arithmetic 6.0.0", - "sp-core 7.0.0", - "sp-io 7.0.0", - "sp-std 5.0.0", - "sp-weights 4.0.0", + "sp-application-crypto 12.0.0", + "sp-arithmetic 9.0.0", + "sp-core 11.0.0", + "sp-io 12.0.0", + "sp-std 6.0.0", + "sp-weights 8.0.0", ] [[package]] name = "sp-runtime" -version = "12.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c86578c67b060a6ecab52af64f1cf18b3892fca7fba5ffc5c49934b2e76b1929" +checksum = "6220216caa67e3d931c693b06a3590dfcaa255f19bb3c3e3150f1672b8bc53f6" dependencies = [ "either", "hash256-std-hasher", @@ -3198,76 +3377,76 @@ dependencies = [ "rand 0.8.5", "scale-info", "serde", - "sp-application-crypto 12.0.0", - "sp-arithmetic 9.0.0", - "sp-core 11.0.0", - "sp-io 12.0.0", - "sp-std 6.0.0", - "sp-weights 8.0.0", + "sp-application-crypto 22.0.0", + "sp-arithmetic 15.0.0", + "sp-core 20.0.0", + "sp-io 22.0.0", + "sp-std 7.0.0", + "sp-weights 19.0.0", ] [[package]] name = "sp-runtime-interface" -version = "7.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b886a5d34400b0e0c12d389e3bb48b7a93d651cddf7e248124b81fe64c339251" +checksum = "f3858935567385728ea45f6d159f9970b0b278eb22a8e77625bbf4a63e43a85a" dependencies = [ "bytes", "impl-trait-for-tuples", "parity-scale-codec", "primitive-types", - "sp-externalities 0.13.0", - "sp-runtime-interface-proc-macro 6.0.0", - "sp-std 5.0.0", - "sp-storage 7.0.0", - "sp-tracing 6.0.0", - "sp-wasm-interface 7.0.0", + "sp-externalities 0.15.0", + "sp-runtime-interface-proc-macro 7.0.0", + "sp-std 6.0.0", + "sp-storage 9.0.0", + "sp-tracing 7.0.0", + "sp-wasm-interface 8.0.0", "static_assertions", ] [[package]] name = "sp-runtime-interface" -version = "10.0.0" +version = "16.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3858935567385728ea45f6d159f9970b0b278eb22a8e77625bbf4a63e43a85a" +checksum = "ca5d0cd80200bf85b8b064238b2508b69b6146b13adf36066ec5d924825af737" dependencies = [ "bytes", "impl-trait-for-tuples", "parity-scale-codec", "primitive-types", - "sp-externalities 0.15.0", - "sp-runtime-interface-proc-macro 7.0.0", - "sp-std 6.0.0", - "sp-storage 9.0.0", - "sp-tracing 7.0.0", - "sp-wasm-interface 8.0.0", + "sp-externalities 0.18.0", + "sp-runtime-interface-proc-macro 10.0.0", + "sp-std 7.0.0", + "sp-storage 12.0.0", + "sp-tracing 9.0.0", + "sp-wasm-interface 13.0.0", "static_assertions", ] [[package]] name = "sp-runtime-interface-proc-macro" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a157f1ce0108b9b87f87e826726049d9b6253318b74410c814be7fc2af416b51" +checksum = "00083a77e938c4f35d0bde7ca0b6e5f616158ebe11af6063795aa664d92a238b" dependencies = [ "Inflector", "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "sp-runtime-interface-proc-macro" -version = "7.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00083a77e938c4f35d0bde7ca0b6e5f616158ebe11af6063795aa664d92a238b" +checksum = "05ae5b00aef477127ddb6177b3464ad1e2bdcc12ee913fc5dfc9d065c6cea89b" dependencies = [ "Inflector", "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -3285,96 +3464,94 @@ dependencies = [ [[package]] name = "sp-state-machine" -version = "0.13.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5c2d97ad69011d34ca257f0383532b80096d53f889f5894ae2b24a211bec66f" +checksum = "f1fd4c600df0b5abf26c19b6c61d928b64e0c2b8a709a3dbef872be0507cd1ca" dependencies = [ - "hash-db", + "hash-db 0.15.2", "log", - "num-traits", "parity-scale-codec", "parking_lot", - "rand 0.7.3", + "rand 0.8.5", "smallvec", - "sp-core 7.0.0", - "sp-externalities 0.13.0", - "sp-panic-handler 5.0.0", - "sp-std 5.0.0", - "sp-trie 7.0.0", + "sp-core 11.0.0", + "sp-externalities 0.15.0", + "sp-panic-handler 6.0.0", + "sp-std 6.0.0", + "sp-trie 11.0.0", "thiserror", "tracing", - "trie-root", ] [[package]] name = "sp-state-machine" -version = "0.17.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fd4c600df0b5abf26c19b6c61d928b64e0c2b8a709a3dbef872be0507cd1ca" +checksum = "b1e49c3bfcc8c832c34552cd8194180cc60508c6d3d9b0b9615d6b7c3e275019" dependencies = [ - "hash-db", + "hash-db 0.16.0", "log", "parity-scale-codec", "parking_lot", "rand 0.8.5", "smallvec", - "sp-core 11.0.0", - "sp-externalities 0.15.0", - "sp-panic-handler 6.0.0", - "sp-std 6.0.0", - "sp-trie 11.0.0", + "sp-core 20.0.0", + "sp-externalities 0.18.0", + "sp-panic-handler 7.0.0", + "sp-std 7.0.0", + "sp-trie 21.0.0", "thiserror", "tracing", ] [[package]] name = "sp-std" -version = "5.0.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3fd4c1d304be101e6ebbafd3d4be9a37b320c970ef4e8df188b16873981c93" +checksum = "af0ee286f98455272f64ac5bb1384ff21ac029fbb669afbaf48477faff12760e" [[package]] name = "sp-std" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af0ee286f98455272f64ac5bb1384ff21ac029fbb669afbaf48477faff12760e" +checksum = "1de8eef39962b5b97478719c493bed2926cf70cb621005bbf68ebe58252ff986" [[package]] name = "sp-storage" -version = "7.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb987ed2e4d7d870170a225083ea962f2a359d75cdf76935d5ed8d91bee912d9" +checksum = "9acb4059eb0ae4fa8cf9ca9119b0178ad312a592d4c6054bd17b411034f233e9" dependencies = [ "impl-serde", "parity-scale-codec", "ref-cast", "serde", - "sp-debug-derive 5.0.0", - "sp-std 5.0.0", + "sp-debug-derive 6.0.0", + "sp-std 6.0.0", ] [[package]] name = "sp-storage" -version = "9.0.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9acb4059eb0ae4fa8cf9ca9119b0178ad312a592d4c6054bd17b411034f233e9" +checksum = "9ad1f8c52d4700ac7bc42b3375679a6c6fc1fe876f4b40c6efdf36f933ef0291" dependencies = [ "impl-serde", "parity-scale-codec", "ref-cast", "serde", - "sp-debug-derive 6.0.0", - "sp-std 6.0.0", + "sp-debug-derive 7.0.0", + "sp-std 7.0.0", ] [[package]] name = "sp-tracing" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e761df87dc940d87720939de8f976d1fc0657e523886ae0d7bf3f7e2e2f0abb6" +checksum = "b22d28a0bc2365dfb86644d14f2682a79da35891d4656d4896fb09fb05ff1e6c" dependencies = [ "parity-scale-codec", - "sp-std 5.0.0", + "sp-std 6.0.0", "tracing", "tracing-core", "tracing-subscriber 0.2.25", @@ -3382,12 +3559,12 @@ dependencies = [ [[package]] name = "sp-tracing" -version = "7.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b22d28a0bc2365dfb86644d14f2682a79da35891d4656d4896fb09fb05ff1e6c" +checksum = "00fab60bf3d42255ce3f678903d3a2564662371c75623de4a1ffc7cac46143df" dependencies = [ "parity-scale-codec", - "sp-std 6.0.0", + "sp-std 7.0.0", "tracing", "tracing-core", "tracing-subscriber 0.2.25", @@ -3395,50 +3572,50 @@ dependencies = [ [[package]] name = "sp-trie" -version = "7.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4f48c887e90050537e399d2d8b6ee82787ebec0fe46e4880b42cab0c2d5ba6" +checksum = "db085f134cb444e52ca569a442d12c84bd17667532613d78dd6f568942632da4" dependencies = [ - "ahash", - "hash-db", - "hashbrown", + "ahash 0.7.6", + "hash-db 0.15.2", + "hashbrown 0.12.3", "lazy_static", "lru", - "memory-db 0.30.0", + "memory-db 0.31.0", "nohash-hasher", "parity-scale-codec", "parking_lot", "scale-info", - "sp-core 7.0.0", - "sp-std 5.0.0", + "sp-core 11.0.0", + "sp-std 6.0.0", "thiserror", "tracing", - "trie-db", - "trie-root", + "trie-db 0.24.0", + "trie-root 0.17.0", ] [[package]] name = "sp-trie" -version = "11.0.0" +version = "21.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db085f134cb444e52ca569a442d12c84bd17667532613d78dd6f568942632da4" +checksum = "58401c53c08b6ecad83acd7e14534c8bbcb3fa73e81e26685e0ac70e51b00c56" dependencies = [ - "ahash", - "hash-db", - "hashbrown", + "ahash 0.8.3", + "hash-db 0.16.0", + "hashbrown 0.13.2", "lazy_static", - "lru", - "memory-db 0.31.0", + "memory-db 0.32.0", "nohash-hasher", "parity-scale-codec", "parking_lot", "scale-info", - "sp-core 11.0.0", - "sp-std 6.0.0", + "schnellru", + "sp-core 20.0.0", + "sp-std 7.0.0", "thiserror", "tracing", - "trie-db", - "trie-root", + "trie-db 0.27.1", + "trie-root 0.18.0", ] [[package]] @@ -3468,67 +3645,68 @@ dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "sp-wasm-interface" -version = "7.0.0" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f43c40afab6ecac20505907631c929957ed636b7af8795984649bbaa6ff38c3" +checksum = "3ebc377987d42f8fc20e3f4ec4fd1147dd098fe90bcb4269e1eddb04e920f889" dependencies = [ "impl-trait-for-tuples", "log", "parity-scale-codec", - "sp-std 5.0.0", + "sp-std 6.0.0", "wasmi", + "wasmtime 1.0.2", ] [[package]] name = "sp-wasm-interface" -version = "8.0.0" +version = "13.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ebc377987d42f8fc20e3f4ec4fd1147dd098fe90bcb4269e1eddb04e920f889" +checksum = "153b7374179439e2aa783c66ed439bd86920c67bbc95d34c76390561972bc02f" dependencies = [ + "anyhow", "impl-trait-for-tuples", "log", "parity-scale-codec", - "sp-std 6.0.0", + "sp-std 7.0.0", "wasmi", - "wasmtime", + "wasmtime 6.0.1", ] [[package]] name = "sp-weights" -version = "4.0.0" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c671673133b30e6ab6d88139b06adcdaec5aa06548abe0e155a0c830b592793b" +checksum = "90eca2a19f48978e9cd605e23905d0602419f7880a9360ac717b03412e9c7916" dependencies = [ - "impl-trait-for-tuples", "parity-scale-codec", "scale-info", "serde", "smallvec", - "sp-arithmetic 6.0.0", - "sp-core 7.0.0", - "sp-debug-derive 5.0.0", - "sp-std 5.0.0", + "sp-arithmetic 9.0.0", + "sp-core 11.0.0", + "sp-debug-derive 6.0.0", + "sp-std 6.0.0", ] [[package]] name = "sp-weights" -version = "8.0.0" +version = "19.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90eca2a19f48978e9cd605e23905d0602419f7880a9360ac717b03412e9c7916" +checksum = "123c661915e1bf328e21f8ecbe4e5247feba86f9149b782ea4348004547ce8ef" dependencies = [ "parity-scale-codec", "scale-info", "serde", "smallvec", - "sp-arithmetic 9.0.0", - "sp-core 11.0.0", - "sp-debug-derive 6.0.0", - "sp-std 6.0.0", + "sp-arithmetic 15.0.0", + "sp-core 20.0.0", + "sp-debug-derive 7.0.0", + "sp-std 7.0.0", ] [[package]] @@ -3614,26 +3792,33 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "subxt" -version = "0.25.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3cbc78fd36035a24883eada29e0205b9b1416172530a7d00a60c07d0337db0c" +checksum = "53b9c4ddefcb2d87eb18a6336f65635c29208f766d0deefaa2a1a19f7426a993" dependencies = [ - "bitvec", + "base58", + "blake2", "derivative", + "either", "frame-metadata", "futures", "getrandom 0.2.8", "hex", + "impl-serde", "jsonrpsee", "parity-scale-codec", "parking_lot", + "primitive-types", + "scale-bits", "scale-decode", + "scale-encode", "scale-info", "scale-value", "serde", "serde_json", - "sp-core 7.0.0", - "sp-runtime 7.0.0", + "sp-core 20.0.0", + "sp-core-hashing 8.0.0", + "sp-runtime 23.0.0", "subxt-macro", "subxt-metadata", "thiserror", @@ -3642,9 +3827,9 @@ dependencies = [ [[package]] name = "subxt-codegen" -version = "0.25.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7722c31febf55eb300c73d977da5d65cfd6fb443419b1185b9abcdd9925fd7be" +checksum = "e924f41069e9273236398ff89662d6d336468a5d94faac812129d44547db0e7f" dependencies = [ "darling", "frame-metadata", @@ -3652,44 +3837,55 @@ dependencies = [ "hex", "jsonrpsee", "parity-scale-codec", - "proc-macro-error", "proc-macro2", "quote", "scale-info", "subxt-metadata", - "syn", + "syn 1.0.109", + "thiserror", "tokio", ] [[package]] name = "subxt-macro" -version = "0.25.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f64826f2c4ba20e3b2a86ec81a6ae8655ca6b6a4c2a6ccc888b6615efc2df14" +checksum = "ced0b043a069ee039f8700d3dfda01be156e4229c82277c305bc8e79a7dd855d" dependencies = [ "darling", "proc-macro-error", "subxt-codegen", - "syn", + "syn 1.0.109", ] [[package]] name = "subxt-metadata" -version = "0.25.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "869af75e23513538ad0af046af4a97b8d684e8d202e35ff4127ee061c1110813" +checksum = "18be3b8f4308fe7369ee1df66ae59c2eca79de20eab57b0f41c75736e843300f" dependencies = [ "frame-metadata", "parity-scale-codec", "scale-info", - "sp-core 7.0.0", + "sp-core-hashing 8.0.0", ] [[package]] name = "syn" -version = "1.0.107" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcf316d5356ed6847742d036f8a39c3b8435cac10bd528a4bd461928a6ab34d5" dependencies = [ "proc-macro2", "quote", @@ -3704,7 +3900,7 @@ checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "unicode-xid", ] @@ -3744,29 +3940,29 @@ dependencies = [ "sp-std 6.0.0", "subxt", "subxt-codegen", - "syn", + "syn 1.0.109", "tokio", "tracing-subscriber 0.3.16", ] [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.14", ] [[package]] @@ -3778,25 +3974,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "tiny-bip39" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" -dependencies = [ - "anyhow", - "hmac 0.8.1", - "once_cell", - "pbkdf2 0.4.0", - "rand 0.7.3", - "rustc-hash", - "sha2 0.9.9", - "thiserror", - "unicode-normalization", - "wasm-bindgen", - "zeroize", -] - [[package]] name = "tiny-bip39" version = "1.0.0" @@ -3833,14 +4010,13 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.26.0" +version = "1.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64" +checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" dependencies = [ "autocfg", "bytes", "libc", - "memchr", "mio", "num_cpus", "pin-project-lite", @@ -3851,13 +4027,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.8.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.14", ] [[package]] @@ -3921,7 +4097,7 @@ checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -3997,8 +4173,21 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "004e1e8f92535694b4cb1444dc5a8073ecf0815e3357f729638b9f8fc4062908" dependencies = [ - "hash-db", - "hashbrown", + "hash-db 0.15.2", + "hashbrown 0.12.3", + "log", + "rustc-hex", + "smallvec", +] + +[[package]] +name = "trie-db" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "767abe6ffed88a1889671a102c2861ae742726f52e0a5a425b92c9fbfa7e9c85" +dependencies = [ + "hash-db 0.16.0", + "hashbrown 0.13.2", "log", "rustc-hex", "smallvec", @@ -4010,7 +4199,16 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a36c5ca3911ed3c9a5416ee6c679042064b93fc637ded67e25f92e68d783891" dependencies = [ - "hash-db", + "hash-db 0.15.2", +] + +[[package]] +name = "trie-root" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4ed310ef5ab98f5fa467900ed906cb9232dd5376597e00fd4cba2a449d06c0b" +dependencies = [ + "hash-db 0.16.0", ] [[package]] @@ -4055,6 +4253,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + [[package]] name = "unicode-ident" version = "1.0.6" @@ -4088,6 +4292,17 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + [[package]] name = "valuable" version = "0.1.0" @@ -4149,7 +4364,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -4171,7 +4386,7 @@ checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4224,6 +4439,16 @@ dependencies = [ "indexmap", ] +[[package]] +name = "wasmparser" +version = "0.100.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b20236ab624147dfbb62cf12a19aaf66af0e41b8398838b66e997d07d269d4" +dependencies = [ + "indexmap", + "url", +] + [[package]] name = "wasmtime" version = "1.0.2" @@ -4242,13 +4467,38 @@ dependencies = [ "psm", "serde", "target-lexicon", - "wasmparser", - "wasmtime-environ", - "wasmtime-jit", - "wasmtime-runtime", + "wasmparser 0.89.1", + "wasmtime-environ 1.0.2", + "wasmtime-jit 1.0.2", + "wasmtime-runtime 1.0.2", "windows-sys 0.36.1", ] +[[package]] +name = "wasmtime" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e89f9819523447330ffd70367ef4a18d8c832e24e8150fe054d1d912841632" +dependencies = [ + "anyhow", + "bincode", + "cfg-if", + "indexmap", + "libc", + "log", + "object 0.29.0", + "once_cell", + "paste", + "psm", + "serde", + "target-lexicon", + "wasmparser 0.100.0", + "wasmtime-environ 6.0.1", + "wasmtime-jit 6.0.1", + "wasmtime-runtime 6.0.1", + "windows-sys 0.42.0", +] + [[package]] name = "wasmtime-asm-macros" version = "1.0.2" @@ -4258,6 +4508,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "wasmtime-asm-macros" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd3a5e46c198032da934469f3a6e48649d1f9142438e4fd4617b68a35644b8a" +dependencies = [ + "cfg-if", +] + [[package]] name = "wasmtime-environ" version = "1.0.2" @@ -4265,7 +4524,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebb881c61f4f627b5d45c54e629724974f8a8890d455bcbe634330cc27309644" dependencies = [ "anyhow", - "cranelift-entity", + "cranelift-entity 0.88.2", + "gimli 0.26.2", + "indexmap", + "log", + "object 0.29.0", + "serde", + "target-lexicon", + "thiserror", + "wasmparser 0.89.1", + "wasmtime-types 1.0.2", +] + +[[package]] +name = "wasmtime-environ" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a6db9fc52985ba06ca601f2ff0ff1f526c5d724c7ac267b47326304b0c97883" +dependencies = [ + "anyhow", + "cranelift-entity 0.93.1", "gimli 0.26.2", "indexmap", "log", @@ -4273,8 +4551,8 @@ dependencies = [ "serde", "target-lexicon", "thiserror", - "wasmparser", - "wasmtime-types", + "wasmparser 0.100.0", + "wasmtime-types 6.0.1", ] [[package]] @@ -4292,15 +4570,38 @@ dependencies = [ "log", "object 0.29.0", "rustc-demangle", - "rustix", + "rustix 0.35.13", "serde", "target-lexicon", "thiserror", - "wasmtime-environ", - "wasmtime-runtime", + "wasmtime-environ 1.0.2", + "wasmtime-runtime 1.0.2", "windows-sys 0.36.1", ] +[[package]] +name = "wasmtime-jit" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b77e3a52cd84d0f7f18554afa8060cfe564ccac61e3b0802d3fd4084772fa5f6" +dependencies = [ + "addr2line 0.17.0", + "anyhow", + "bincode", + "cfg-if", + "cpp_demangle", + "gimli 0.26.2", + "log", + "object 0.29.0", + "rustc-demangle", + "serde", + "target-lexicon", + "wasmtime-environ 6.0.1", + "wasmtime-jit-icache-coherence", + "wasmtime-runtime 6.0.1", + "windows-sys 0.42.0", +] + [[package]] name = "wasmtime-jit-debug" version = "1.0.2" @@ -4310,6 +4611,26 @@ dependencies = [ "once_cell", ] +[[package]] +name = "wasmtime-jit-debug" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0245e8a9347017c7185a72e215218a802ff561545c242953c11ba00fccc930f" +dependencies = [ + "once_cell", +] + +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67d412e9340ab1c83867051d8d1d7c90aa8c9afc91da086088068e2734e25064" +dependencies = [ + "cfg-if", + "libc", + "windows-sys 0.42.0", +] + [[package]] name = "wasmtime-runtime" version = "1.0.2" @@ -4326,24 +4647,60 @@ dependencies = [ "memoffset", "paste", "rand 0.8.5", - "rustix", + "rustix 0.35.13", "thiserror", - "wasmtime-asm-macros", - "wasmtime-environ", - "wasmtime-jit-debug", + "wasmtime-asm-macros 1.0.2", + "wasmtime-environ 1.0.2", + "wasmtime-jit-debug 1.0.2", "windows-sys 0.36.1", ] +[[package]] +name = "wasmtime-runtime" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d594e791b5fdd4dbaf8cf7ae62f2e4ff85018ce90f483ca6f42947688e48827d" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "indexmap", + "libc", + "log", + "mach", + "memfd", + "memoffset", + "paste", + "rand 0.8.5", + "rustix 0.36.12", + "wasmtime-asm-macros 6.0.1", + "wasmtime-environ 6.0.1", + "wasmtime-jit-debug 6.0.1", + "windows-sys 0.42.0", +] + [[package]] name = "wasmtime-types" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d23d61cb4c46e837b431196dd06abb11731541021916d03476a178b54dc07aeb" dependencies = [ - "cranelift-entity", + "cranelift-entity 0.88.2", + "serde", + "thiserror", + "wasmparser 0.89.1", +] + +[[package]] +name = "wasmtime-types" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6688d6f96d4dbc1f89fab626c56c1778936d122b5f4ae7a57c2eb42b8d982e2" +dependencies = [ + "cranelift-entity 0.93.1", "serde", "thiserror", - "wasmparser", + "wasmparser 0.100.0", ] [[package]] @@ -4425,12 +4782,12 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ - "windows_aarch64_gnullvm", + "windows_aarch64_gnullvm 0.42.2", "windows_aarch64_msvc 0.42.2", "windows_i686_gnu 0.42.2", "windows_i686_msvc 0.42.2", "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm", + "windows_x86_64_gnullvm 0.42.2", "windows_x86_64_msvc 0.42.2", ] @@ -4440,7 +4797,16 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets", + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", ] [[package]] @@ -4449,21 +4815,42 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" dependencies = [ - "windows_aarch64_gnullvm", + "windows_aarch64_gnullvm 0.42.2", "windows_aarch64_msvc 0.42.2", "windows_i686_gnu 0.42.2", "windows_i686_msvc 0.42.2", "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm", + "windows_x86_64_gnullvm 0.42.2", "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + [[package]] name = "windows_aarch64_msvc" version = "0.36.1" @@ -4476,6 +4863,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + [[package]] name = "windows_i686_gnu" version = "0.36.1" @@ -4488,6 +4881,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + [[package]] name = "windows_i686_msvc" version = "0.36.1" @@ -4500,6 +4899,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + [[package]] name = "windows_x86_64_gnu" version = "0.36.1" @@ -4512,12 +4917,24 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + [[package]] name = "windows_x86_64_msvc" version = "0.36.1" @@ -4530,6 +4947,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + [[package]] name = "wyz" version = "0.5.1" @@ -4541,9 +4964,9 @@ dependencies = [ [[package]] name = "yap" -version = "0.7.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc77f52dc9e9b10d55d3f4462c3b7fc393c4f17975d641542833ab2d3bc26ef" +checksum = "e2a7eb6d82a11e4d0b8e6bda8347169aff4ccd8235d039bba7c47482d977dcf7" [[package]] name = "zeroize" @@ -4562,6 +4985,6 @@ checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "synstructure", ] diff --git a/clients/tfchain_client_rs/Cargo.toml b/clients/tfchain_client_rs/Cargo.toml index 4cf20659b..892f931f8 100644 --- a/clients/tfchain_client_rs/Cargo.toml +++ b/clients/tfchain_client_rs/Cargo.toml @@ -9,13 +9,9 @@ edition = "2021" path = "src/lib.rs" name = "tfchain_client" -[[bin]] -path = "src/main.rs" -name = "tfchain_cli" - [dependencies] -subxt = "0.25.0" -subxt-codegen = "0.25.0" +subxt = "0.28.0" +subxt-codegen = "0.28.0" syn = "1.0.99" tokio = { version = "1.8", features = ["rt-multi-thread", "macros", "time"] } futures-util = "0.3.23" diff --git a/clients/tfchain_client_rs/artifacts/devnet.scale b/clients/tfchain_client_rs/artifacts/current.scale similarity index 100% rename from clients/tfchain_client_rs/artifacts/devnet.scale rename to clients/tfchain_client_rs/artifacts/current.scale diff --git a/clients/tfchain_client_rs/artifacts/local.scale b/clients/tfchain_client_rs/artifacts/local.scale deleted file mode 100644 index 18e8da5eea79392de21766625c4f5c0a544c6dc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100718 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 diff --git a/clients/tfchain_client_rs/artifacts/mainnet.scale b/clients/tfchain_client_rs/artifacts/mainnet.scale deleted file mode 100644 index b571132d2af2e9cd52e17d09a7d7347fa53faf99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100554 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 diff --git a/clients/tfchain_client_rs/artifacts/testnet.scale b/clients/tfchain_client_rs/artifacts/testnet.scale deleted file mode 100644 index 98f2a95e7a318865c55eb29a20c570110525a91a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100438 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 Result { - match v { - "local" => Ok(Self::Local), - "devnet" => Ok(Self::Devnet), - "mainnet" => Ok(Self::Mainnet), - "testnet" => Ok(Self::Testnet), - _ => Err("unknown runtime"), - } - } -} #[derive(Debug, Clone, Copy, serde::Serialize, serde::Deserialize)] pub enum KeyType { @@ -78,10 +54,38 @@ impl KeyPair { Ok(pair) } - pub fn signer(&self) -> Box + Send + Sync> { + pub fn signer(&self) -> KeySigner { + match self { + Self::Ed25519(pair) => KeySigner::Ed25519(PairSigner::new(pair.clone())), + Self::Sr25519(pair) => KeySigner::Sr25519(PairSigner::new(pair.clone())), + } + } +} + +pub enum KeySigner { + Sr25519(PairSigner), + Ed25519(PairSigner), +} + +impl Signer for KeySigner { + fn account_id(&self) -> &::AccountId { + match self { + Self::Sr25519(signer) => signer.account_id(), + Self::Ed25519(signer) => signer.account_id(), + } + } + + fn address(&self) -> ::Address { + match self { + Self::Sr25519(signer) => signer.address(), + Self::Ed25519(signer) => signer.address(), + } + } + + fn sign(&self, signer_payload: &[u8]) -> ::Signature { match self { - Self::Ed25519(pair) => Box::new(PairSigner::new(pair.clone())), - Self::Sr25519(pair) => Box::new(PairSigner::new(pair.clone())), + Self::Sr25519(signer) => signer.sign(signer_payload), + Self::Ed25519(signer) => signer.sign(signer_payload), } } } @@ -100,26 +104,14 @@ impl From for KeyPair { #[derive(Clone)] pub struct Client { - pub runtime: Runtime, pub api: OnlineClient, } -macro_rules! call { - ($self:ident, $name:ident, $($arg:expr),+) => ( - match $self.runtime { - Runtime::Local => local::$name($self, $($arg),+).await, - Runtime::Devnet => devnet::$name($self, $($arg),+).await, - Runtime::Testnet => testnet::$name($self, $($arg),+).await, - Runtime::Mainnet => mainnet::$name($self, $($arg),+).await, - } - ) -} - impl Client { - pub async fn new>(url: U, runtime: Runtime) -> Result { + pub async fn new>(url: U) -> Result { let api = OnlineClient::::from_url(url).await?; - Ok(Client { api, runtime }) + Ok(Client { api }) } // Creates a twin and checks for success, twin ID is returned on success @@ -129,7 +121,7 @@ impl Client { relay: Option, pk: Option, ) -> Result { - call!(self, create_twin, kp, relay, pk) + current::create_twin(self, kp, relay, pk).await } // Updates a twin and checks for success, blockhash is returned on success @@ -139,7 +131,7 @@ impl Client { relay: Option, pk: Option<&[u8]>, ) -> Result { - call!(self, update_twin, kp, relay, pk) + current::update_twin(self, kp, relay, pk).await } // Signs terms and condition and checks for success, blockhash is returned on success @@ -149,67 +141,40 @@ impl Client { document_link: String, document_hash: String, ) -> Result { - call!( - self, - sign_terms_and_conditions, - kp, - document_link, - document_hash - ) + current::sign_terms_and_conditions(self, kp, document_link, document_hash).await } - pub async fn get_twin_by_id( - &self, - id: u32, - at_block: Option, - ) -> Result, Error> { - call!(self, get_twin_by_id, id, at_block) + pub async fn get_twin_by_id(&self, id: u32) -> Result, Error> { + current::get_twin_by_id(self, id).await } - pub async fn get_twin_id_by_account( - &self, - account: AccountId32, - at_block: Option, - ) -> Result, Error> { - call!(self, get_twin_id_by_account, account, at_block) + pub async fn get_twin_id_by_account(&self, account: AccountId32) -> Result, Error> { + current::get_twin_id_by_account(self, account).await } - pub async fn get_farm_by_id( - &self, - id: u32, - at_block: Option, - ) -> Result, Error> { - call!(self, get_farm_by_id, id, at_block) + pub async fn get_farm_by_id(&self, id: u32) -> Result, Error> { + current::get_farm_by_id(self, id).await } - pub async fn get_node_by_id( - &self, - id: u32, - at_block: Option, - ) -> Result, Error> { - call!(self, get_node_by_id, id, at_block) + pub async fn get_node_by_id(&self, id: u32) -> Result, Error> { + current::get_node_by_id(self, id).await } pub async fn get_balance( &self, account: &AccountId32, - at_block: Option, ) -> Result, Error> { - call!(self, get_balance, account, at_block) + current::get_balance(self, account).await } pub async fn get_block_hash( &self, block_number: Option, ) -> Result, Error> { - call!(self, get_block_hash, block_number) + current::get_block_hash(self, block_number).await } - pub async fn get_contract_by_id( - &self, - id: u64, - at_block: Option, - ) -> Result, Error> { - call!(self, get_contract_by_id, id, at_block) + pub async fn get_contract_by_id(&self, id: u64) -> Result, Error> { + current::get_contract_by_id(self, id).await } } diff --git a/clients/tfchain_client_rs/src/main.rs b/clients/tfchain_client_rs/src/main.rs deleted file mode 100644 index 351273b4c..000000000 --- a/clients/tfchain_client_rs/src/main.rs +++ /dev/null @@ -1,142 +0,0 @@ -// use codec::Decode; -// use futures::StreamExt; -// use sp_keyring::AccountKeyring; -// use std::time::Duration; -// use subxt::{tx::PairSigner, OnlineClient, SubstrateConfig}; - -// #[subxt::subxt(runtime_metadata_path = "artifacts/devnet.scale")] -// pub mod devnet {} - -// pub mod client; - -// /// Subscribe to all events, and then manually look through them and -// /// pluck out the events that we care about. -// #[tokio::main] -// async fn main() -> Result<(), Box> { -// tracing_subscriber::fmt::init(); - -// // Create a client to use: -// let api = OnlineClient::::new().await?; - -// // Subscribe to any events that occur: -// let mut event_sub = api.events().subscribe().await?; - -// // While this subscription is active, balance transfers are made somewhere: -// tokio::task::spawn({ -// let api = api.clone(); -// async move { -// let signer = PairSigner::new(AccountKeyring::Alice.pair()); -// let mut transfer_amount = 1_000_000_000; - -// // Make small balance transfers from Alice to Bob in a loop: -// loop { -// let transfer_tx = devnet::tx() -// .balances() -// .transfer(AccountKeyring::Bob.to_account_id().into(), transfer_amount); -// api.tx() -// .sign_and_submit_default(&transfer_tx, &signer) -// .await -// .unwrap(); - -// tokio::time::sleep(Duration::from_secs(10)).await; -// transfer_amount += 100_000_000; -// } -// } -// }); - -// // Our subscription will see the events emitted as a result of this: -// while let Some(events) = event_sub.next().await { -// let events = events?; -// let block_hash = events.block_hash(); - -// // We can dynamically decode events: -// println!(" Dynamic event details: {block_hash:?}:"); -// for event in events.iter() { -// let event = event?; -// let is_balance_transfer = event -// .as_event::()? -// .is_some(); -// let pallet = event.pallet_name(); -// let variant = event.variant_name(); -// println!(" {pallet}::{variant} (is balance transfer? {is_balance_transfer})"); -// } - -// // Or we can find the first transfer event, ignoring any others: -// let transfer_event = events.find_first::()?; - -// if let Some(ev) = transfer_event { -// println!(" - Balance transfer success: value: {:?}", ev.amount); -// } else { -// println!(" - No balance transfer event found in this block"); -// } -// } - -// Ok(()) -// } - -pub mod client; -pub mod runtimes; - -use crate::runtimes::types::BlockNumber; -use crate::runtimes::types::Hash; -use client::{KeyPair, KeyType, Runtime}; - -#[tokio::main] -async fn main() -> Result<(), Box> { - // let phrase = "oyster orient plunge devote light wrap hold mother essence casino rebel distance"; - // let p = KeyPair::from_phrase(KeyType::Sr25519, phrase, None) - // .expect("failed to get key from phrase"); - - // let seed = "0x9917ea107aca8e9c29f4530413b41333ada03cf39fede45cde611b943e2e8dd1"; - // let _ = KeyPair::from_phrase(KeyType::Sr25519, seed, None); - - // let cl = client::Client::new( - // String::from("wss://tfchain.dev.grid.tf:443"), - // Runtime::Devnet, - // ) - // .await?; - - let cl = client::Client::new( - String::from("wss://tfchain.test.grid.tf:443"), - Runtime::Testnet, - ) - .await?; - - let twin = cl.get_twin_by_id(105, None).await?; - println!("got twin: {:?}", twin); - - // let twin = cl.get_twin_by_id(1, None).await?; - // println!("got twin: {:?}", twin); - - let farm = cl.get_farm_by_id(1, None).await?; - println!("got farm: {:?}", farm); - - // let block_1 = cl - // .get_block_hash(Some(BlockNumber::from(5808046 as u64))) - // .await?; - // let cl2 = - // client::Client::new(String::from("wss://tfchain.grid.tf:443"), Runtime::Testnet).await?; - // let node2 = cl2.get_node_by_id(1, block_1).await?; - // println!("got node: {:?}", node2); - - // println!("block 1 hash {:?}", block_1); - // let node = cl.get_node_by_id(1, block_1).await?; - // println!("got node: {:?}", node); - - // let account = "5HmARi4eGLhb9hvFrbCC5F8dCNRTS8MWKc6xbmPUS1cnKD7c" - // .parse::() - // .unwrap(); - - // let balance_at_block_1 = cl.get_balance(&account, block_1).await; - // println!("balance at block 1: {:?}", balance_at_block_1); - - // let balance = cl.get_balance(&account, None).await?; - // println!("balance at current block: {:?}", balance); - - // let _ = cl.get_contract_by_id(915).await?; - - // let node = cl.get_node_by_id(15).await?; - // println!("got node: {:?}", node); - - Ok(()) -} diff --git a/clients/tfchain_client_rs/src/runtimes/devnet.rs b/clients/tfchain_client_rs/src/runtimes/current.rs similarity index 51% rename from clients/tfchain_client_rs/src/runtimes/devnet.rs rename to clients/tfchain_client_rs/src/runtimes/current.rs index 2c877eef5..e5dbb3604 100644 --- a/clients/tfchain_client_rs/src/runtimes/devnet.rs +++ b/clients/tfchain_client_rs/src/runtimes/current.rs @@ -1,23 +1,28 @@ -#[subxt::subxt(runtime_metadata_path = "artifacts/devnet.scale")] -pub mod devnet { - #[subxt(substitute_type = "frame_support::storage::bounded_vec::BoundedVec")] - use ::sp_std::vec::Vec; -} -use super::types; -pub use devnet::runtime_types::frame_system::AccountInfo; -pub use devnet::runtime_types::pallet_balances::AccountData; -pub use devnet::runtime_types::pallet_smart_contract::types::Contract; -pub use devnet::runtime_types::pallet_tfgrid::{ +#[subxt::subxt( + runtime_metadata_path = "artifacts/current.scale", + substitute_type( + type = "frame_support::storage::bounded_vec::BoundedVec", + with = "::sp_std::vec::Vec" + ) +)] +pub mod current {} + +pub use current::runtime_types::frame_system::AccountInfo; +pub use current::runtime_types::pallet_balances::AccountData; +pub use current::runtime_types::pallet_smart_contract::types::Contract; +pub use current::runtime_types::pallet_tfgrid::{ farm::FarmName, interface::{InterfaceIp, InterfaceMac, InterfaceName}, node::{Location, SerialNumber}, types::Twin as TwinData, }; -use devnet::runtime_types::sp_core::bounded::bounded_vec::BoundedVec; -pub use devnet::runtime_types::tfchain_support::types::{ +use current::runtime_types::sp_core::bounded::bounded_vec::BoundedVec; +pub use current::runtime_types::tfchain_support::types::{ Farm as FarmData, Interface, Node as NodeData, PublicConfig, PublicIP as PublicIpData, }; -use subxt::ext::{sp_core::H256, sp_runtime::AccountId32}; +pub use subxt::ext::sp_core::H256; +pub use subxt::rpc::types::BlockNumber; +use subxt::utils::AccountId32; use subxt::Error; pub type Twin = TwinData; @@ -29,9 +34,9 @@ pub type Node = NodeData; use crate::client::{Client, KeyPair}; -pub use devnet::tft_bridge_module::events::BurnTransactionReady; -pub use devnet::tft_bridge_module::events::BurnTransactionSignatureAdded; -pub use devnet::tft_bridge_module::events::MintTransactionProposed; +pub use current::tft_bridge_module::events::BurnTransactionReady; +pub use current::tft_bridge_module::events::BurnTransactionSignatureAdded; +pub use current::tft_bridge_module::events::MintTransactionProposed; pub type SystemAccountInfo = AccountInfo>; @@ -41,7 +46,7 @@ pub async fn create_twin( relay: Option, pk: Option, ) -> Result { - let create_twin_tx = devnet::tx().tfgrid_module().create_twin( + let create_twin_tx = current::tx().tfgrid_module().create_twin( relay.map(|r| BoundedVec(r.as_bytes().to_vec())), pk.map(|r| BoundedVec(r.as_bytes().to_vec())), ); @@ -51,13 +56,13 @@ pub async fn create_twin( let create_twin = cl .api .tx() - .sign_and_submit_then_watch_default(&create_twin_tx, signer.as_ref()) + .sign_and_submit_then_watch_default(&create_twin_tx, &signer) .await? .wait_for_finalized_success() .await?; let twin_create_event = - create_twin.find_first::()?; + create_twin.find_first::()?; if let Some(event) = twin_create_event { Ok(event.0.id) @@ -72,7 +77,7 @@ pub async fn update_twin( relay: Option, pk: Option<&[u8]>, ) -> Result { - let update_twin_tx = devnet::tx().tfgrid_module().update_twin( + let update_twin_tx = current::tx().tfgrid_module().update_twin( relay.map(|r| BoundedVec(r.as_bytes().to_vec())), pk.map(|r| BoundedVec(r.to_vec())), ); @@ -82,13 +87,13 @@ pub async fn update_twin( let update_twin = cl .api .tx() - .sign_and_submit_then_watch_default(&update_twin_tx, signer.as_ref()) + .sign_and_submit_then_watch_default(&update_twin_tx, &signer) .await? .wait_for_finalized_success() .await?; let twin_create_event = - update_twin.find_first::()?; + update_twin.find_first::()?; if let Some(_) = twin_create_event { Ok(update_twin.block_hash()) @@ -103,7 +108,7 @@ pub async fn sign_terms_and_conditions( document_link: String, document_hash: String, ) -> Result { - let sign_tandc_tx = devnet::tx().tfgrid_module().user_accept_tc( + let sign_tandc_tx = current::tx().tfgrid_module().user_accept_tc( BoundedVec(document_link.as_bytes().to_vec()), BoundedVec(document_hash.as_bytes().to_vec()), ); @@ -113,7 +118,7 @@ pub async fn sign_terms_and_conditions( let sign_tandc = cl .api .tx() - .sign_and_submit_then_watch_default(&sign_tandc_tx, signer.as_ref()) + .sign_and_submit_then_watch_default(&sign_tandc_tx, &signer) .await? .wait_for_finalized_success() .await?; @@ -121,93 +126,78 @@ pub async fn sign_terms_and_conditions( Ok(sign_tandc.block_hash()) } -pub async fn get_twin_by_id( - cl: &Client, - id: u32, - at_block: Option, -) -> Result, Error> { +pub async fn get_twin_by_id(cl: &Client, id: u32) -> Result, Error> { Ok(cl .api .storage() - .fetch(&devnet::storage().tfgrid_module().twins(id), at_block) + .at_latest() .await? - .map(types::Twin::from)) + .fetch(¤t::storage().tfgrid_module().twins(id)) + .await?) } pub async fn get_twin_id_by_account( cl: &Client, account: AccountId32, - at_block: Option, ) -> Result, Error> { cl.api .storage() + .at_latest() + .await? .fetch( - &devnet::storage() + ¤t::storage() .tfgrid_module() .twin_id_by_account_id(account), - at_block, ) .await } -pub async fn get_contract_by_id( - cl: &Client, - id: u64, - at_block: Option, -) -> Result, Error> { +pub async fn get_contract_by_id(cl: &Client, id: u64) -> Result, Error> { Ok(cl .api .storage() - .fetch( - &devnet::storage().smart_contract_module().contracts(id), - at_block, - ) + .at_latest() .await? - .map(types::Contract::from)) + .fetch(¤t::storage().smart_contract_module().contracts(id)) + .await?) } -pub async fn get_node_by_id( - cl: &Client, - id: u32, - at_block: Option, -) -> Result, Error> { +pub async fn get_node_by_id(cl: &Client, id: u32) -> Result, Error> { Ok(cl .api .storage() - .fetch(&devnet::storage().tfgrid_module().nodes(id), at_block) + .at_latest() .await? - .map(types::TfgridNode::from)) + .fetch(¤t::storage().tfgrid_module().nodes(id)) + .await?) } -pub async fn get_farm_by_id( - cl: &Client, - id: u32, - at_block: Option, -) -> Result, Error> { +pub async fn get_farm_by_id(cl: &Client, id: u32) -> Result, Error> { Ok(cl .api .storage() - .fetch(&devnet::storage().tfgrid_module().farms(id), at_block) + .at_latest() .await? - .map(types::TfgridFarm::from)) + .fetch(¤t::storage().tfgrid_module().farms(id)) + .await?) } pub async fn get_block_hash( cl: &Client, - block_number: Option, -) -> Result, Error> { + block_number: Option, +) -> Result, Error> { cl.api.rpc().block_hash(block_number).await } pub async fn get_balance( cl: &Client, account: &AccountId32, - at_block: Option, -) -> Result, Error> { +) -> Result, Error> { Ok(cl .api .storage() - .fetch(&devnet::storage().system().account(account), at_block) + .at_latest() .await? - .map(types::SystemAccountInfo::from)) + .fetch(¤t::storage().system().account(account)) + .await?) } diff --git a/clients/tfchain_client_rs/src/runtimes/local.rs b/clients/tfchain_client_rs/src/runtimes/local.rs deleted file mode 100644 index a3ac75175..000000000 --- a/clients/tfchain_client_rs/src/runtimes/local.rs +++ /dev/null @@ -1,216 +0,0 @@ -#[subxt::subxt(runtime_metadata_path = "artifacts/local.scale")] -pub mod local { - #[subxt(substitute_type = "frame_support::storage::bounded_vec::BoundedVec")] - use ::sp_std::vec::Vec; - #[subxt(substitute_type = "bounded::bounded::BoundedVec")] - use ::sp_std::vec::Vec; -} -use super::types; -pub use local::runtime_types::frame_system::AccountInfo; -pub use local::runtime_types::pallet_balances::AccountData; -pub use local::runtime_types::pallet_smart_contract::types::Contract; -pub use local::runtime_types::pallet_tfgrid::{ - farm::FarmName, - interface::{InterfaceIp, InterfaceMac, InterfaceName}, - node::{Location, SerialNumber}, - types::Twin as TwinData, -}; -pub use local::runtime_types::tfchain_support::types::{ - Farm as FarmData, Interface, Node as NodeData, PublicConfig, PublicIP as PublicIpData, -}; -use subxt::ext::{sp_core::H256, sp_runtime::AccountId32}; - -use subxt::Error; - -use local::runtime_types::sp_core::bounded::bounded_vec::BoundedVec; - -pub type Twin = TwinData; - -pub type Farm = FarmData; - -pub type InterfaceOf = Interface>; -pub type Node = NodeData; - -pub type SystemAccountInfo = AccountInfo>; - -use crate::client::{Client, KeyPair}; - -pub use local::tft_bridge_module::events::BurnTransactionReady; -pub use local::tft_bridge_module::events::BurnTransactionSignatureAdded; -pub use local::tft_bridge_module::events::MintTransactionProposed; - -pub async fn create_twin( - cl: &Client, - kp: &KeyPair, - relay: Option, - pk: Option, -) -> Result { - let create_twin_tx = local::tx().tfgrid_module().create_twin( - relay.map(|r| BoundedVec(r.as_bytes().to_vec())), - pk.map(|r| BoundedVec(r.as_bytes().to_vec())), - ); - - let signer = kp.signer(); - - let create_twin = cl - .api - .tx() - .sign_and_submit_then_watch_default(&create_twin_tx, signer.as_ref()) - .await? - .wait_for_finalized_success() - .await?; - - let twin_create_event = create_twin.find_first::()?; - - if let Some(event) = twin_create_event { - Ok(event.0.id) - } else { - Err(Error::Other(String::from("failed to create twin"))) - } -} - -pub async fn update_twin( - cl: &Client, - kp: &KeyPair, - relay: Option, - pk: Option<&[u8]>, -) -> Result { - let update_twin_tx = local::tx().tfgrid_module().update_twin( - relay.map(|r| BoundedVec(r.as_bytes().to_vec())), - pk.map(|r| BoundedVec(r.to_vec())), - ); - - let signer = kp.signer(); - - let update_twin = cl - .api - .tx() - .sign_and_submit_then_watch_default(&update_twin_tx, signer.as_ref()) - .await? - .wait_for_finalized_success() - .await?; - - let twin_create_event = - update_twin.find_first::()?; - - if let Some(_) = twin_create_event { - Ok(update_twin.block_hash()) - } else { - Err(Error::Other(String::from("failed to create twin"))) - } -} - -pub async fn sign_terms_and_conditions( - cl: &Client, - kp: &KeyPair, - document_link: String, - document_hash: String, -) -> Result { - let sign_tandc_tx = local::tx().tfgrid_module().user_accept_tc( - BoundedVec(document_link.as_bytes().to_vec()), - BoundedVec(document_hash.as_bytes().to_vec()), - ); - - let signer = kp.signer(); - - let sign_tandc = cl - .api - .tx() - .sign_and_submit_then_watch_default(&sign_tandc_tx, signer.as_ref()) - .await? - .wait_for_finalized_success() - .await?; - - Ok(sign_tandc.block_hash()) -} - -pub async fn get_twin_by_id( - cl: &Client, - id: u32, - at_block: Option, -) -> Result, Error> { - Ok(cl - .api - .storage() - .fetch(&local::storage().tfgrid_module().twins(id), at_block) - .await? - .map(types::Twin::from)) -} - -pub async fn get_twin_id_by_account( - cl: &Client, - account: AccountId32, - at_block: Option, -) -> Result, Error> { - cl.api - .storage() - .fetch( - &local::storage() - .tfgrid_module() - .twin_id_by_account_id(account), - at_block, - ) - .await -} - -pub async fn get_contract_by_id( - cl: &Client, - id: u64, - at_block: Option, -) -> Result, Error> { - Ok(cl - .api - .storage() - .fetch( - &local::storage().smart_contract_module().contracts(id), - at_block, - ) - .await? - .map(types::Contract::from)) -} - -pub async fn get_node_by_id( - cl: &Client, - id: u32, - at_block: Option, -) -> Result, Error> { - Ok(cl - .api - .storage() - .fetch(&local::storage().tfgrid_module().nodes(id), at_block) - .await? - .map(types::TfgridNode::from)) -} - -pub async fn get_farm_by_id( - cl: &Client, - id: u32, - at_block: Option, -) -> Result, Error> { - Ok(cl - .api - .storage() - .fetch(&local::storage().tfgrid_module().farms(id), at_block) - .await? - .map(types::TfgridFarm::from)) -} - -pub async fn get_block_hash( - cl: &Client, - block_number: Option, -) -> Result, Error> { - cl.api.rpc().block_hash(block_number).await -} - -pub async fn get_balance( - cl: &Client, - account: &AccountId32, - at_block: Option, -) -> Result, Error> { - Ok(cl - .api - .storage() - .fetch(&local::storage().system().account(account), at_block) - .await? - .map(types::SystemAccountInfo::from)) -} diff --git a/clients/tfchain_client_rs/src/runtimes/mainnet.rs b/clients/tfchain_client_rs/src/runtimes/mainnet.rs deleted file mode 100644 index 765ae1fd1..000000000 --- a/clients/tfchain_client_rs/src/runtimes/mainnet.rs +++ /dev/null @@ -1,219 +0,0 @@ -#[subxt::subxt(runtime_metadata_path = "artifacts/mainnet.scale")] -pub mod mainnet { - #[subxt(substitute_type = "frame_support::storage::bounded_vec::BoundedVec")] - use ::sp_std::vec::Vec; -} -use super::types; -pub use mainnet::runtime_types::frame_system::AccountInfo; -pub use mainnet::runtime_types::pallet_balances::AccountData; -pub use mainnet::runtime_types::pallet_smart_contract::types::Contract; -pub use mainnet::runtime_types::pallet_tfgrid::{ - farm::FarmName, - interface::{InterfaceIp, InterfaceMac, InterfaceName}, - node::{Location, SerialNumber}, - twin::TwinIp, - types::Twin as TwinData, -}; -use mainnet::runtime_types::sp_core::bounded::bounded_vec::BoundedVec; -pub use mainnet::runtime_types::tfchain_support::types::{ - Farm as FarmData, Interface, Node as NodeData, PublicConfig, PublicIP as PublicIpData, -}; -use subxt::ext::{sp_core::H256, sp_runtime::AccountId32}; - -use subxt::Error; - -pub type Twin = TwinData; - -pub type Farm = FarmData; - -pub type InterfaceOf = Interface>; -pub type Node = NodeData; - -use crate::client::{Client, KeyPair}; - -pub use mainnet::tft_bridge_module::events::BurnTransactionReady; -pub use mainnet::tft_bridge_module::events::BurnTransactionSignatureAdded; -pub use mainnet::tft_bridge_module::events::MintTransactionProposed; - -pub type SystemAccountInfo = AccountInfo>; - -pub async fn create_twin( - cl: &Client, - kp: &KeyPair, - ip: Option, - _pk: Option, -) -> Result { - let ip = match ip { - Some(ip) => BoundedVec(ip.as_bytes().to_vec()), - None => BoundedVec(vec![]), - }; - - let create_twin_tx = mainnet::tx().tfgrid_module().create_twin(ip); - - let signer = kp.signer(); - - let create_twin = cl - .api - .tx() - .sign_and_submit_then_watch_default(&create_twin_tx, signer.as_ref()) - .await? - .wait_for_finalized_success() - .await?; - - let twin_create_event = - create_twin.find_first::()?; - - if let Some(event) = twin_create_event { - Ok(event.0.id) - } else { - Err(Error::Other(String::from("failed to create twin"))) - } -} - -pub async fn update_twin( - cl: &Client, - kp: &KeyPair, - ip: Option, - _pk: Option<&[u8]>, -) -> Result { - let ip = match ip { - Some(ip) => BoundedVec(ip.as_bytes().to_vec()), - None => BoundedVec(vec![]), - }; - - let update_twin_tx = mainnet::tx().tfgrid_module().update_twin(ip); - - let signer = kp.signer(); - - let update_twin = cl - .api - .tx() - .sign_and_submit_then_watch_default(&update_twin_tx, signer.as_ref()) - .await? - .wait_for_finalized_success() - .await?; - - let twin_create_event = - update_twin.find_first::()?; - - if let Some(_) = twin_create_event { - Ok(update_twin.block_hash()) - } else { - Err(Error::Other(String::from("failed to create twin"))) - } -} - -pub async fn sign_terms_and_conditions( - cl: &Client, - kp: &KeyPair, - document_link: String, - document_hash: String, -) -> Result { - let sign_tandc_tx = mainnet::tx().tfgrid_module().user_accept_tc( - BoundedVec(document_link.as_bytes().to_vec()), - BoundedVec(document_hash.as_bytes().to_vec()), - ); - - let signer = kp.signer(); - - let sign_tandc = cl - .api - .tx() - .sign_and_submit_then_watch_default(&sign_tandc_tx, signer.as_ref()) - .await? - .wait_for_finalized_success() - .await?; - - Ok(sign_tandc.block_hash()) -} - -pub async fn get_twin_by_id( - cl: &Client, - id: u32, - at_block: Option, -) -> Result, Error> { - Ok(cl - .api - .storage() - .fetch(&mainnet::storage().tfgrid_module().twins(id), at_block) - .await? - .map(types::Twin::from)) -} - -pub async fn get_twin_id_by_account( - cl: &Client, - account: AccountId32, - at_block: Option, -) -> Result, Error> { - cl.api - .storage() - .fetch( - &mainnet::storage() - .tfgrid_module() - .twin_id_by_account_id(account), - at_block, - ) - .await -} - -pub async fn get_contract_by_id( - cl: &Client, - id: u64, - at_block: Option, -) -> Result, Error> { - Ok(cl - .api - .storage() - .fetch( - &mainnet::storage().smart_contract_module().contracts(id), - at_block, - ) - .await? - .map(types::Contract::from)) -} - -pub async fn get_node_by_id( - cl: &Client, - id: u32, - at_block: Option, -) -> Result, Error> { - Ok(cl - .api - .storage() - .fetch(&mainnet::storage().tfgrid_module().nodes(id), at_block) - .await? - .map(types::TfgridNode::from)) -} - -pub async fn get_farm_by_id( - cl: &Client, - id: u32, - at_block: Option, -) -> Result, Error> { - Ok(cl - .api - .storage() - .fetch(&mainnet::storage().tfgrid_module().farms(id), at_block) - .await? - .map(types::TfgridFarm::from)) -} - -pub async fn get_block_hash( - cl: &Client, - block_number: Option, -) -> Result, Error> { - cl.api.rpc().block_hash(block_number).await -} - -pub async fn get_balance( - cl: &Client, - account: &AccountId32, - at_block: Option, -) -> Result, Error> { - Ok(cl - .api - .storage() - .fetch(&mainnet::storage().system().account(account), at_block) - .await? - .map(|t| types::SystemAccountInfo::from(t))) -} diff --git a/clients/tfchain_client_rs/src/runtimes/mod.rs b/clients/tfchain_client_rs/src/runtimes/mod.rs index 2ce94e6df..efcfceb63 100644 --- a/clients/tfchain_client_rs/src/runtimes/mod.rs +++ b/clients/tfchain_client_rs/src/runtimes/mod.rs @@ -1,7 +1,3 @@ #![allow(clippy::all)] -pub mod devnet; -pub mod local; -pub mod mainnet; -pub mod testnet; -pub mod types; +pub mod current; diff --git a/clients/tfchain_client_rs/src/runtimes/testnet.rs b/clients/tfchain_client_rs/src/runtimes/testnet.rs deleted file mode 100644 index e88c1757b..000000000 --- a/clients/tfchain_client_rs/src/runtimes/testnet.rs +++ /dev/null @@ -1,217 +0,0 @@ -#[subxt::subxt(runtime_metadata_path = "artifacts/testnet.scale")] -pub mod testnet { - #[subxt(substitute_type = "frame_support::storage::bounded_vec::BoundedVec")] - use ::sp_std::vec::Vec; -} -use super::types; -use subxt::ext::{sp_core::H256, sp_runtime::AccountId32}; -use subxt::Error; -pub use testnet::runtime_types::frame_system::AccountInfo; -pub use testnet::runtime_types::pallet_balances::AccountData; -pub use testnet::runtime_types::pallet_smart_contract::types::Contract; -pub use testnet::runtime_types::pallet_tfgrid::{ - farm::FarmName, - interface::{InterfaceIp, InterfaceMac, InterfaceName}, - node::{Location, SerialNumber}, - twin::TwinIp, - types::Twin as TwinData, -}; -use testnet::runtime_types::sp_core::bounded::bounded_vec::BoundedVec; - -pub use testnet::runtime_types::tfchain_support::types::{ - Farm as FarmData, Interface, Node as NodeData, PublicConfig, PublicIP as PublicIpData, -}; - -pub type Twin = TwinData; - -pub type Farm = FarmData; - -pub type InterfaceOf = Interface>; -pub type Node = NodeData; - -use crate::client::{Client, KeyPair}; - -pub use testnet::tft_bridge_module::events::BurnTransactionReady; -pub use testnet::tft_bridge_module::events::BurnTransactionSignatureAdded; -pub use testnet::tft_bridge_module::events::MintTransactionProposed; - -pub type SystemAccountInfo = AccountInfo>; - -pub async fn create_twin( - cl: &Client, - kp: &KeyPair, - ip: Option, - _pk: Option, -) -> Result { - let ip = match ip { - Some(ip) => BoundedVec(ip.as_bytes().to_vec()), - None => BoundedVec(vec![]), - }; - let create_twin_tx = testnet::tx().tfgrid_module().create_twin(ip); - - let signer = kp.signer(); - - let create_twin = cl - .api - .tx() - .sign_and_submit_then_watch_default(&create_twin_tx, signer.as_ref()) - .await? - .wait_for_finalized_success() - .await?; - - let twin_create_event = - create_twin.find_first::()?; - - if let Some(event) = twin_create_event { - Ok(event.0.id) - } else { - Err(Error::Other(String::from("failed to create twin"))) - } -} - -pub async fn update_twin( - cl: &Client, - kp: &KeyPair, - ip: Option, - _pk: Option<&[u8]>, -) -> Result { - let ip = match ip { - Some(ip) => BoundedVec(ip.as_bytes().to_vec()), - None => BoundedVec(vec![]), - }; - let update_twin_tx = testnet::tx().tfgrid_module().update_twin(ip); - - let signer = kp.signer(); - - let update_twin = cl - .api - .tx() - .sign_and_submit_then_watch_default(&update_twin_tx, signer.as_ref()) - .await? - .wait_for_finalized_success() - .await?; - - let twin_create_event = - update_twin.find_first::()?; - - if let Some(_) = twin_create_event { - Ok(update_twin.block_hash()) - } else { - Err(Error::Other(String::from("failed to create twin"))) - } -} - -pub async fn sign_terms_and_conditions( - cl: &Client, - kp: &KeyPair, - document_link: String, - document_hash: String, -) -> Result { - let sign_tandc_tx = testnet::tx().tfgrid_module().user_accept_tc( - BoundedVec(document_link.as_bytes().to_vec()), - BoundedVec(document_hash.as_bytes().to_vec()), - ); - - let signer = kp.signer(); - - let sign_tandc = cl - .api - .tx() - .sign_and_submit_then_watch_default(&sign_tandc_tx, signer.as_ref()) - .await? - .wait_for_finalized_success() - .await?; - - Ok(sign_tandc.block_hash()) -} - -pub async fn get_twin_by_id( - cl: &Client, - id: u32, - at_block: Option, -) -> Result, Error> { - Ok(cl - .api - .storage() - .fetch(&testnet::storage().tfgrid_module().twins(id), at_block) - .await? - .map(types::Twin::from)) -} - -pub async fn get_twin_id_by_account( - cl: &Client, - account: AccountId32, - at_block: Option, -) -> Result, Error> { - cl.api - .storage() - .fetch( - &testnet::storage() - .tfgrid_module() - .twin_id_by_account_id(account), - at_block, - ) - .await -} - -pub async fn get_contract_by_id( - cl: &Client, - id: u64, - at_block: Option, -) -> Result, Error> { - Ok(cl - .api - .storage() - .fetch( - &testnet::storage().smart_contract_module().contracts(id), - at_block, - ) - .await? - .map(types::Contract::from)) -} - -pub async fn get_node_by_id( - cl: &Client, - id: u32, - at_block: Option, -) -> Result, Error> { - Ok(cl - .api - .storage() - .fetch(&testnet::storage().tfgrid_module().nodes(id), at_block) - .await? - .map(types::TfgridNode::from)) -} - -pub async fn get_farm_by_id( - cl: &Client, - id: u32, - at_block: Option, -) -> Result, Error> { - Ok(cl - .api - .storage() - .fetch(&testnet::storage().tfgrid_module().farms(id), at_block) - .await? - .map(types::TfgridFarm::from)) -} - -pub async fn get_block_hash( - cl: &Client, - block_number: Option, -) -> Result, Error> { - cl.api.rpc().block_hash(block_number).await -} - -pub async fn get_balance( - cl: &Client, - account: &AccountId32, - at_block: Option, -) -> Result, Error> { - Ok(cl - .api - .storage() - .fetch(&testnet::storage().system().account(account), at_block) - .await? - .map(types::SystemAccountInfo::from)) -} diff --git a/clients/tfchain_client_rs/src/runtimes/types.rs b/clients/tfchain_client_rs/src/runtimes/types.rs deleted file mode 100644 index 433cf152c..000000000 --- a/clients/tfchain_client_rs/src/runtimes/types.rs +++ /dev/null @@ -1,1169 +0,0 @@ -use serde::{Deserialize, Serialize}; -use subxt::{ext::sp_runtime::AccountId32, Config, PolkadotConfig}; - -use frame_system::AccountInfo; -use pallet_balances::AccountData; - -use super::local::local::runtime_types::pallet_tfgrid::types::EntityProof as LocalEntityProof; -use super::local::local::runtime_types::tfchain_support::types::{ - FarmCertification as LocalFarmCertification, NodeCertification as LocalNodeCertification, -}; -use super::local::{ - Contract as LocalContract, Farm as LocalFarm, Node as LocalNode, - SystemAccountInfo as LocalSystemAccountInfo, Twin as LocalTwin, -}; - -use super::devnet::devnet::runtime_types::pallet_tfgrid::types::EntityProof as DevnetEntityProof; -use super::devnet::devnet::runtime_types::tfchain_support::types::{ - FarmCertification as DevnetFarmCertification, NodeCertification as DevnetNodeCertification, -}; -use super::devnet::{ - Contract as DevnetContract, Farm as DevnetFarm, Node as DevnetNode, - SystemAccountInfo as DevnetSystemAccountInfo, Twin as DevnetTwin, -}; - -use super::mainnet::mainnet::runtime_types::pallet_tfgrid::types::EntityProof as MainnetEntityProof; -use super::mainnet::mainnet::runtime_types::tfchain_support::types::{ - FarmCertification as MainnetFarmCertification, NodeCertification as MainnetNodeCertification, -}; -use super::mainnet::{ - Contract as MainnetContract, Farm as MainnetFarm, Node as MainnetNode, - SystemAccountInfo as MainnetSystemAccountInfo, Twin as MainnetTwin, -}; - -use super::testnet::testnet::runtime_types::pallet_tfgrid::types::EntityProof as TestnetEntityProof; -use super::testnet::testnet::runtime_types::tfchain_support::types::{ - FarmCertification as TestnetFarmCertification, NodeCertification as TestnetNodeCertification, -}; -use super::testnet::{ - Contract as TestnetContract, Farm as TestnetFarm, Node as TestnetNode, - SystemAccountInfo as TestnetSystemAccountInfo, Twin as TestnetTwin, -}; - -pub type Hash = ::Hash; -pub type BlockNumber = subxt::rpc::BlockNumber; - -#[macro_export] -macro_rules! parse_vec_u8 { - ($input:expr) => { - String::from_utf8($input).expect("invalid utf8") - }; -} - -#[derive(Debug, Clone)] -pub enum FarmCertification { - NotCertified, - Gold, -} - -#[derive(Debug, Clone)] -pub struct TfgridFarm { - pub version: u32, - pub id: u32, - pub name: String, - pub twin_id: u32, - pub pricing_policy_id: u32, - pub certification: FarmCertification, - pub dedicated_farm: bool, - pub farming_policy_limits: Option, - pub public_ips: Vec, -} - -#[derive(Debug, Clone)] -pub struct TfgridNode { - pub version: u32, - pub id: u32, - pub farm_id: u32, - pub twin_id: u32, - pub resources: ConsumableResources, - pub location: Location, - pub power: Power, - pub public_config: Option, - pub created: u64, - pub farming_policy_id: u32, - pub interfaces: Vec, - pub certification: NodeCertification, - pub secure_boot: bool, - pub serial_number: Option, - pub connection_price: u32, -} - -#[derive(Debug, Clone, Default)] -pub struct ConsumableResources { - pub total_resources: Resources, - pub used_resources: Resources, -} - -#[derive(Debug, Clone, Default)] -pub struct Resources { - pub hru: u64, - pub sru: u64, - pub cru: u64, - pub mru: u64, -} - -#[derive(Debug, Clone)] -pub struct Location { - pub city: String, - pub country: String, - pub latitude: String, - pub longitude: String, -} - -#[derive(Debug, Clone)] -pub struct IP { - pub ip: String, - pub gw: String, -} - -#[derive(Debug, Clone)] -pub struct PublicConfig { - pub ip4: IP, - pub ip6: Option, - pub domain: Option, -} - -#[derive(Debug, Clone)] -pub struct Power { - pub target: PowerTarget, - pub state: PowerState, - pub last_uptime: u64, -} - -#[derive(Debug, Clone)] -pub enum PowerTarget { - Up, - Down, -} - -#[derive(Debug, Clone)] -pub enum PowerState { - Up, - Down(u32), -} - -#[derive(Debug, Clone)] -pub enum NodeCertification { - Diy, - Certified, -} - -#[derive(Debug, Clone)] -pub struct Interface { - pub name: String, - pub mac: String, - pub ips: Vec, -} - -#[derive(Debug, Clone)] -pub struct FarmPublicIP { - pub ip: String, - pub gateway: String, - pub contract_id: u64, -} - -#[derive(Debug, Clone)] -pub struct FarmingPolicyLimit { - pub farming_policy_id: u32, - pub cu: Option, - pub su: Option, - pub end: Option, - pub node_count: Option, - pub node_certification: bool, -} - -#[derive(Debug, Clone, Default)] -pub struct Contract { - pub version: u32, - pub state: ContractState, - pub contract_id: u64, - pub twin_id: u32, - pub contract_type: ContractData, - pub solution_provider_id: Option, -} - -#[derive(Debug, Clone)] -pub enum ContractState { - Created, - Deleted(Cause), - GracePeriod(u32), -} - -#[derive(Debug, Clone)] -pub enum Cause { - CanceledByUser, - OutOfFunds, -} - -impl Default for ContractState { - fn default() -> ContractState { - ContractState::Created - } -} - -// HexHash is hex encoded hash -pub type HexHash = [u8; 32]; - -#[derive(Debug, Clone, Default)] -pub struct NodeContract { - pub node_id: u32, - // Hash of the deployment, set by the user - // Max 32 bytes - pub deployment_hash: HexHash, - pub deployment_data: String, - pub public_ips: u32, - pub public_ips_list: Vec, -} - -#[derive(Debug, Clone, Default)] -pub struct NameContract { - pub name: String, -} - -#[derive(Debug, Clone, Default)] -pub struct RentContract { - pub node_id: u32, -} - -#[derive(Debug, Clone)] -pub enum ContractData { - NodeContract(NodeContract), - NameContract(NameContract), - RentContract(RentContract), -} - -impl Default for ContractData { - fn default() -> ContractData { - ContractData::RentContract(RentContract::default()) - } -} - -impl From for Contract { - fn from(contract: LocalContract) -> Self { - let mut ctr = Contract { - version: contract.version, - contract_id: contract.contract_id, - twin_id: contract.twin_id, - state: ContractState::Created, - solution_provider_id: contract.solution_provider_id, - contract_type: ContractData::default(), - }; - - match contract.contract_type { - super::local::local::runtime_types::pallet_smart_contract::types::ContractData::NodeContract(nc) => { - - ctr.contract_type = ContractData::NodeContract(NodeContract{ - node_id: nc.node_id, - deployment_data: parse_vec_u8!(nc.deployment_data.0), - deployment_hash: nc.deployment_hash.into(), - public_ips: nc.public_ips, - public_ips_list: nc.public_ips_list.0.iter().map(|ip| IP { - ip: parse_vec_u8!(ip.ip.0.clone()), - gw: parse_vec_u8!(ip.gateway.0.clone()) - }).collect() - }); - }, - super::local::local::runtime_types::pallet_smart_contract::types::ContractData::NameContract(nmc) => { - ctr.contract_type = ContractData::NameContract(NameContract{ name: parse_vec_u8!(nmc.name.0.0) }) - }, - super::local::local::runtime_types::pallet_smart_contract::types::ContractData::RentContract(rc) => { - ctr.contract_type = ContractData::RentContract(RentContract { node_id: rc.node_id }) - } - } - - match contract.state { - super::local::local::runtime_types::pallet_smart_contract::types::ContractState::Created => { - ctr.state = ContractState::Created - }, - super::local::local::runtime_types::pallet_smart_contract::types::ContractState::GracePeriod(block) => { - ctr.state = ContractState::GracePeriod(block as u32) - }, - _ => () - }; - - ctr - } -} - -impl From for Contract { - fn from(contract: DevnetContract) -> Self { - let mut ctr = Contract { - version: contract.version, - contract_id: contract.contract_id, - twin_id: contract.twin_id, - state: ContractState::Created, - solution_provider_id: contract.solution_provider_id, - contract_type: ContractData::default(), - }; - - match contract.contract_type { - super::devnet::devnet::runtime_types::pallet_smart_contract::types::ContractData::NodeContract(nc) => { - - ctr.contract_type = ContractData::NodeContract(NodeContract{ - node_id: nc.node_id, - deployment_data: parse_vec_u8!(nc.deployment_data.0), - deployment_hash: nc.deployment_hash.into(), - public_ips: nc.public_ips, - public_ips_list: nc.public_ips_list.0.iter().map(|ip| IP { - ip: parse_vec_u8!(ip.ip.0.clone()), - gw: parse_vec_u8!(ip.gateway.0.clone()) - }).collect() - }); - }, - super::devnet::devnet::runtime_types::pallet_smart_contract::types::ContractData::NameContract(nmc) => { - ctr.contract_type = ContractData::NameContract(NameContract{ name: parse_vec_u8!(nmc.name.0.0) }) - }, - super::devnet::devnet::runtime_types::pallet_smart_contract::types::ContractData::RentContract(rc) => { - ctr.contract_type = ContractData::RentContract(RentContract { node_id: rc.node_id }) - } - } - - match contract.state { - super::devnet::devnet::runtime_types::pallet_smart_contract::types::ContractState::Created => { - ctr.state = ContractState::Created - }, - super::devnet::devnet::runtime_types::pallet_smart_contract::types::ContractState::GracePeriod(block) => { - ctr.state = ContractState::GracePeriod(block as u32) - }, - _ => () - }; - - ctr - } -} - -impl From for Contract { - fn from(contract: TestnetContract) -> Self { - let mut ctr = Contract { - version: contract.version, - contract_id: contract.contract_id, - twin_id: contract.twin_id, - state: ContractState::Created, - solution_provider_id: contract.solution_provider_id, - contract_type: ContractData::default(), - }; - - match contract.contract_type { - super::testnet::testnet::runtime_types::pallet_smart_contract::types::ContractData::NodeContract(nc) => { - - ctr.contract_type = ContractData::NodeContract(NodeContract{ - node_id: nc.node_id, - deployment_data: parse_vec_u8!(nc.deployment_data.0), - deployment_hash: nc.deployment_hash.into(), - public_ips: nc.public_ips, - public_ips_list: nc.public_ips_list.0.iter().map(|ip| IP { - ip: parse_vec_u8!(ip.ip.0.clone()), - gw: parse_vec_u8!(ip.gateway.0.clone()) - }).collect() - }); - }, - super::testnet::testnet::runtime_types::pallet_smart_contract::types::ContractData::NameContract(nmc) => { - ctr.contract_type = ContractData::NameContract(NameContract{ name: parse_vec_u8!(nmc.name.0.0) }) - }, - super::testnet::testnet::runtime_types::pallet_smart_contract::types::ContractData::RentContract(rc) => { - ctr.contract_type = ContractData::RentContract(RentContract { node_id: rc.node_id }) - } - } - - match contract.state { - super::testnet::testnet::runtime_types::pallet_smart_contract::types::ContractState::Created => { - ctr.state = ContractState::Created - }, - super::testnet::testnet::runtime_types::pallet_smart_contract::types::ContractState::GracePeriod(block) => { - ctr.state = ContractState::GracePeriod(block as u32) - }, - _ => () - }; - - ctr - } -} - -impl From for Contract { - fn from(contract: MainnetContract) -> Self { - let mut ctr = Contract { - version: contract.version, - contract_id: contract.contract_id, - twin_id: contract.twin_id, - state: ContractState::Created, - solution_provider_id: contract.solution_provider_id, - contract_type: ContractData::default(), - }; - - match contract.contract_type { - super::mainnet::mainnet::runtime_types::pallet_smart_contract::types::ContractData::NodeContract(nc) => { - - ctr.contract_type = ContractData::NodeContract(NodeContract{ - node_id: nc.node_id, - deployment_data: parse_vec_u8!(nc.deployment_data.0), - deployment_hash: nc.deployment_hash.into(), - public_ips: nc.public_ips, - public_ips_list: nc.public_ips_list.0.iter().map(|ip| IP { - ip: parse_vec_u8!(ip.ip.0.clone()), - gw: parse_vec_u8!(ip.gateway.0.clone()) - }).collect() - }); - }, - super::mainnet::mainnet::runtime_types::pallet_smart_contract::types::ContractData::NameContract(nmc) => { - ctr.contract_type = ContractData::NameContract(NameContract{ name: parse_vec_u8!(nmc.name.0.0) }) - }, - super::mainnet::mainnet::runtime_types::pallet_smart_contract::types::ContractData::RentContract(rc) => { - ctr.contract_type = ContractData::RentContract(RentContract { node_id: rc.node_id }) - } - } - - match contract.state { - super::mainnet::mainnet::runtime_types::pallet_smart_contract::types::ContractState::Created => { - ctr.state = ContractState::Created - }, - super::mainnet::mainnet::runtime_types::pallet_smart_contract::types::ContractState::GracePeriod(block) => { - ctr.state = ContractState::GracePeriod(block as u32) - }, - _ => () - }; - - ctr - } -} - -impl From for TfgridFarm { - fn from(farm: MainnetFarm) -> Self { - let farm_name = parse_vec_u8!(farm.name.0 .0); - - let limit: Option = match farm.farming_policy_limits { - Some(lim) => Some(FarmingPolicyLimit { - cu: lim.cu, - su: lim.su, - end: lim.end, - farming_policy_id: lim.farming_policy_id, - node_certification: lim.node_certification, - node_count: lim.node_count, - }), - None => None, - }; - - let mut public_ips = vec![]; - for ip in farm.public_ips.0 { - public_ips.push(FarmPublicIP { - ip: parse_vec_u8!(ip.ip.0), - gateway: parse_vec_u8!(ip.gateway.0), - contract_id: ip.contract_id, - }) - } - - let farm_certification: FarmCertification = match farm.certification { - MainnetFarmCertification::Gold => FarmCertification::Gold, - MainnetFarmCertification::NotCertified => FarmCertification::NotCertified, - }; - - TfgridFarm { - version: farm.version, - id: farm.id, - name: farm_name, - twin_id: farm.twin_id, - pricing_policy_id: farm.pricing_policy_id, - certification: farm_certification, - dedicated_farm: farm.dedicated_farm, - farming_policy_limits: limit, - public_ips, - } - } -} - -impl From for TfgridFarm { - fn from(farm: TestnetFarm) -> Self { - let farm_name = parse_vec_u8!(farm.name.0 .0); - - let limit: Option = match farm.farming_policy_limits { - Some(lim) => Some(FarmingPolicyLimit { - cu: lim.cu, - su: lim.su, - end: lim.end, - farming_policy_id: lim.farming_policy_id, - node_certification: lim.node_certification, - node_count: lim.node_count, - }), - None => None, - }; - - let mut public_ips = vec![]; - for ip in farm.public_ips.0 { - public_ips.push(FarmPublicIP { - ip: parse_vec_u8!(ip.ip.0), - gateway: parse_vec_u8!(ip.gateway.0), - contract_id: ip.contract_id, - }) - } - - let farm_certification: FarmCertification = match farm.certification { - TestnetFarmCertification::Gold => FarmCertification::Gold, - TestnetFarmCertification::NotCertified => FarmCertification::NotCertified, - }; - - TfgridFarm { - version: farm.version, - id: farm.id, - name: farm_name, - twin_id: farm.twin_id, - pricing_policy_id: farm.pricing_policy_id, - certification: farm_certification, - dedicated_farm: farm.dedicated_farm, - farming_policy_limits: limit, - public_ips, - } - } -} - -impl From for TfgridFarm { - fn from(farm: DevnetFarm) -> Self { - let farm_name = parse_vec_u8!(farm.name.0 .0); - - let limit: Option = match farm.farming_policy_limits { - Some(lim) => Some(FarmingPolicyLimit { - cu: lim.cu, - su: lim.su, - end: lim.end, - farming_policy_id: lim.farming_policy_id, - node_certification: lim.node_certification, - node_count: lim.node_count, - }), - None => None, - }; - - let mut public_ips = vec![]; - for ip in farm.public_ips.0 { - public_ips.push(FarmPublicIP { - ip: parse_vec_u8!(ip.ip.0), - gateway: parse_vec_u8!(ip.gateway.0), - contract_id: ip.contract_id, - }) - } - - let farm_certification: FarmCertification = match farm.certification { - DevnetFarmCertification::Gold => FarmCertification::Gold, - DevnetFarmCertification::NotCertified => FarmCertification::NotCertified, - }; - - TfgridFarm { - version: farm.version, - id: farm.id, - name: farm_name, - twin_id: farm.twin_id, - pricing_policy_id: farm.pricing_policy_id, - certification: farm_certification, - dedicated_farm: farm.dedicated_farm, - farming_policy_limits: limit, - public_ips, - } - } -} - -impl From for TfgridFarm { - fn from(farm: LocalFarm) -> Self { - let farm_name = parse_vec_u8!(farm.name.0 .0); - - let limit: Option = match farm.farming_policy_limits { - Some(lim) => Some(FarmingPolicyLimit { - cu: lim.cu, - su: lim.su, - end: lim.end, - farming_policy_id: lim.farming_policy_id, - node_certification: lim.node_certification, - node_count: lim.node_count, - }), - None => None, - }; - - let mut public_ips = vec![]; - for ip in farm.public_ips.0 { - public_ips.push(FarmPublicIP { - ip: parse_vec_u8!(ip.ip.0), - gateway: parse_vec_u8!(ip.gateway.0), - contract_id: ip.contract_id, - }) - } - - let farm_certification: FarmCertification = match farm.certification { - LocalFarmCertification::Gold => FarmCertification::Gold, - LocalFarmCertification::NotCertified => FarmCertification::NotCertified, - }; - - TfgridFarm { - version: farm.version, - id: farm.id, - name: farm_name, - twin_id: farm.twin_id, - pricing_policy_id: farm.pricing_policy_id, - certification: farm_certification, - dedicated_farm: farm.dedicated_farm, - farming_policy_limits: limit, - public_ips, - } - } -} - -impl From for TfgridNode { - fn from(node: LocalNode) -> Self { - let mut resources = ConsumableResources::default(); - resources.total_resources.cru = node.resources.cru; - resources.total_resources.hru = node.resources.hru; - resources.total_resources.mru = node.resources.mru; - resources.total_resources.sru = node.resources.sru; - - let location = Location { - city: parse_vec_u8!(node.location.city.0 .0), - country: parse_vec_u8!(node.location.country.0 .0), - latitude: parse_vec_u8!(node.location.latitude.0), - longitude: parse_vec_u8!(node.location.longitude.0), - }; - - let public_config = match node.public_config { - Some(config) => { - let mut pub_conf = PublicConfig { - ip4: IP { - ip: parse_vec_u8!(config.ip4.ip.0), - gw: parse_vec_u8!(config.ip4.gw.0), - }, - ip6: None, - domain: None, - }; - - pub_conf.ip6 = match config.ip6 { - Some(conf6) => Some(IP { - ip: parse_vec_u8!(conf6.ip.0), - gw: parse_vec_u8!(conf6.gw.0), - }), - None => None, - }; - - pub_conf.domain = match config.domain { - Some(domain) => Some(parse_vec_u8!(domain.0)), - None => None, - }; - - Some(pub_conf) - } - None => None, - }; - - let interfaces = node - .interfaces - .into_iter() - .map(|intf| { - let ips = intf - .ips - .0 - .into_iter() - .map(|ip| parse_vec_u8!(ip.0 .0)) - .collect(); - Interface { - name: parse_vec_u8!(intf.name.0 .0), - mac: parse_vec_u8!(intf.mac.0 .0), - ips, - } - }) - .collect(); - - let certification = match node.certification { - LocalNodeCertification::Certified => NodeCertification::Certified, - LocalNodeCertification::Diy => NodeCertification::Diy, - }; - - let serial_number = match node.serial_number { - Some(s) => Some(parse_vec_u8!(s.0 .0)), - None => None, - }; - - TfgridNode { - version: node.version, - id: node.id, - farm_id: node.farm_id, - twin_id: node.twin_id, - resources, - location, - power: Power { - target: PowerTarget::Up, - state: PowerState::Up, - last_uptime: 0, - }, - public_config, - created: node.created, - farming_policy_id: node.farming_policy_id, - interfaces, - certification, - secure_boot: node.secure_boot, - serial_number, - connection_price: node.connection_price, - } - } -} - -impl From for TfgridNode { - fn from(node: DevnetNode) -> Self { - let mut resources = ConsumableResources::default(); - resources.total_resources.cru = node.resources.cru; - resources.total_resources.hru = node.resources.hru; - resources.total_resources.mru = node.resources.mru; - resources.total_resources.sru = node.resources.sru; - - let location = Location { - city: parse_vec_u8!(node.location.city.0 .0), - country: parse_vec_u8!(node.location.country.0 .0), - latitude: parse_vec_u8!(node.location.latitude.0), - longitude: parse_vec_u8!(node.location.longitude.0), - }; - - let public_config = match node.public_config { - Some(config) => { - let mut pub_conf = PublicConfig { - ip4: IP { - ip: parse_vec_u8!(config.ip4.ip.0), - gw: parse_vec_u8!(config.ip4.gw.0), - }, - ip6: None, - domain: None, - }; - - pub_conf.ip6 = match config.ip6 { - Some(conf6) => Some(IP { - ip: parse_vec_u8!(conf6.ip.0), - gw: parse_vec_u8!(conf6.gw.0), - }), - None => None, - }; - - pub_conf.domain = match config.domain { - Some(domain) => Some(parse_vec_u8!(domain.0)), - None => None, - }; - - Some(pub_conf) - } - None => None, - }; - - let interfaces = node - .interfaces - .into_iter() - .map(|intf| { - let ips = intf - .ips - .0 - .into_iter() - .map(|ip| parse_vec_u8!(ip.0 .0)) - .collect(); - Interface { - name: parse_vec_u8!(intf.name.0 .0), - mac: parse_vec_u8!(intf.mac.0 .0), - ips, - } - }) - .collect(); - - let certification = match node.certification { - DevnetNodeCertification::Certified => NodeCertification::Certified, - DevnetNodeCertification::Diy => NodeCertification::Diy, - }; - - let serial_number = match node.serial_number { - Some(s) => Some(parse_vec_u8!(s.0 .0)), - None => None, - }; - - TfgridNode { - version: node.version, - id: node.id, - farm_id: node.farm_id, - twin_id: node.twin_id, - resources, - location, - power: Power { - target: PowerTarget::Up, - state: PowerState::Up, - last_uptime: 0, - }, - public_config, - created: node.created, - farming_policy_id: node.farming_policy_id, - interfaces, - certification, - secure_boot: node.secure_boot, - serial_number, - connection_price: node.connection_price, - } - } -} - -impl From for TfgridNode { - fn from(node: TestnetNode) -> Self { - let mut resources = ConsumableResources::default(); - resources.total_resources.cru = node.resources.cru; - resources.total_resources.hru = node.resources.hru; - resources.total_resources.mru = node.resources.mru; - resources.total_resources.sru = node.resources.sru; - - let location = Location { - city: parse_vec_u8!(node.location.city.0 .0), - country: parse_vec_u8!(node.location.country.0 .0), - latitude: parse_vec_u8!(node.location.latitude.0), - longitude: parse_vec_u8!(node.location.longitude.0), - }; - - let public_config = match node.public_config { - Some(config) => { - let mut pub_conf = PublicConfig { - ip4: IP { - ip: parse_vec_u8!(config.ip4.ip.0), - gw: parse_vec_u8!(config.ip4.gw.0), - }, - ip6: None, - domain: None, - }; - - pub_conf.ip6 = match config.ip6 { - Some(conf6) => Some(IP { - ip: parse_vec_u8!(conf6.ip.0), - gw: parse_vec_u8!(conf6.gw.0), - }), - None => None, - }; - - pub_conf.domain = match config.domain { - Some(domain) => Some(parse_vec_u8!(domain.0)), - None => None, - }; - - Some(pub_conf) - } - None => None, - }; - - let interfaces = node - .interfaces - .into_iter() - .map(|intf| { - let ips = intf - .ips - .0 - .into_iter() - .map(|ip| parse_vec_u8!(ip.0 .0)) - .collect(); - Interface { - name: parse_vec_u8!(intf.name.0 .0), - mac: parse_vec_u8!(intf.mac.0 .0), - ips, - } - }) - .collect(); - - let certification = match node.certification { - TestnetNodeCertification::Certified => NodeCertification::Certified, - TestnetNodeCertification::Diy => NodeCertification::Diy, - }; - - let serial_number = match node.serial_number { - Some(s) => Some(parse_vec_u8!(s.0 .0)), - None => None, - }; - - TfgridNode { - version: node.version, - id: node.id, - farm_id: node.farm_id, - twin_id: node.twin_id, - resources, - location, - power: Power { - target: PowerTarget::Up, - state: PowerState::Up, - last_uptime: 0, - }, - public_config, - created: node.created, - farming_policy_id: node.farming_policy_id, - interfaces, - certification, - secure_boot: node.secure_boot, - serial_number, - connection_price: node.connection_price, - } - } -} - -impl From for TfgridNode { - fn from(node: MainnetNode) -> Self { - let mut resources = ConsumableResources::default(); - resources.total_resources.cru = node.resources.cru; - resources.total_resources.hru = node.resources.hru; - resources.total_resources.mru = node.resources.mru; - resources.total_resources.sru = node.resources.sru; - - let location = Location { - city: parse_vec_u8!(node.location.city.0 .0), - country: parse_vec_u8!(node.location.country.0 .0), - latitude: parse_vec_u8!(node.location.latitude.0), - longitude: parse_vec_u8!(node.location.longitude.0), - }; - - let public_config = match node.public_config { - Some(config) => { - let mut pub_conf = PublicConfig { - ip4: IP { - ip: parse_vec_u8!(config.ip4.ip.0), - gw: parse_vec_u8!(config.ip4.gw.0), - }, - ip6: None, - domain: None, - }; - - pub_conf.ip6 = match config.ip6 { - Some(conf6) => Some(IP { - ip: parse_vec_u8!(conf6.ip.0), - gw: parse_vec_u8!(conf6.gw.0), - }), - None => None, - }; - - pub_conf.domain = match config.domain { - Some(domain) => Some(parse_vec_u8!(domain.0)), - None => None, - }; - - Some(pub_conf) - } - None => None, - }; - - let interfaces = node - .interfaces - .into_iter() - .map(|intf| { - let ips = intf - .ips - .0 - .into_iter() - .map(|ip| parse_vec_u8!(ip.0 .0)) - .collect(); - Interface { - name: parse_vec_u8!(intf.name.0 .0), - mac: parse_vec_u8!(intf.mac.0 .0), - ips, - } - }) - .collect(); - - let certification = match node.certification { - MainnetNodeCertification::Certified => NodeCertification::Certified, - MainnetNodeCertification::Diy => NodeCertification::Diy, - }; - - let serial_number = match node.serial_number { - Some(s) => Some(parse_vec_u8!(s.0 .0)), - None => None, - }; - - TfgridNode { - version: node.version, - id: node.id, - farm_id: node.farm_id, - twin_id: node.twin_id, - resources, - location, - power: Power { - target: PowerTarget::Up, - state: PowerState::Up, - last_uptime: 0, - }, - public_config, - created: node.created, - farming_policy_id: node.farming_policy_id, - interfaces, - certification, - secure_boot: node.secure_boot, - serial_number, - connection_price: node.connection_price, - } - } -} - -pub type SystemAccountInfo = AccountInfo>; - -impl From for SystemAccountInfo { - fn from(info: MainnetSystemAccountInfo) -> Self { - SystemAccountInfo { - nonce: info.nonce, - consumers: info.consumers, - providers: info.providers, - sufficients: info.sufficients, - data: pallet_balances::AccountData { - free: info.data.free, - fee_frozen: info.data.fee_frozen, - misc_frozen: info.data.misc_frozen, - reserved: info.data.reserved, - }, - } - } -} - -impl From for SystemAccountInfo { - fn from(info: TestnetSystemAccountInfo) -> Self { - SystemAccountInfo { - nonce: info.nonce, - consumers: info.consumers, - providers: info.providers, - sufficients: info.sufficients, - data: pallet_balances::AccountData { - free: info.data.free, - fee_frozen: info.data.fee_frozen, - misc_frozen: info.data.misc_frozen, - reserved: info.data.reserved, - }, - } - } -} - -impl From for SystemAccountInfo { - fn from(info: DevnetSystemAccountInfo) -> Self { - SystemAccountInfo { - nonce: info.nonce, - consumers: info.consumers, - providers: info.providers, - sufficients: info.sufficients, - data: pallet_balances::AccountData { - free: info.data.free, - fee_frozen: info.data.fee_frozen, - misc_frozen: info.data.misc_frozen, - reserved: info.data.reserved, - }, - } - } -} - -impl From for SystemAccountInfo { - fn from(info: LocalSystemAccountInfo) -> Self { - SystemAccountInfo { - nonce: info.nonce, - consumers: info.consumers, - providers: info.providers, - sufficients: info.sufficients, - data: pallet_balances::AccountData { - free: info.data.free, - fee_frozen: info.data.fee_frozen, - misc_frozen: info.data.misc_frozen, - reserved: info.data.reserved, - }, - } - } -} - -#[derive(Deserialize, Serialize, Debug, Clone, Eq, PartialEq)] -pub struct Twin { - pub id: u32, - pub account: AccountId32, - pub relay: Option, - pub entities: Vec, - pub pk: Option>, -} - -#[derive(Deserialize, Serialize, Debug, Clone, Eq, PartialEq)] -pub struct EntityProof { - entity_id: u32, - signature: String, -} - -impl From for Twin { - fn from(twin: LocalTwin) -> Self { - let entities = twin.entities.into_iter().map(|e| e.into()).collect(); - - Twin { - id: twin.id, - account: twin.account_id, - relay: twin.relay.map(|v| parse_vec_u8!(v.0)), - entities, - pk: twin.pk.map(|v| v.0), - } - } -} - -impl From for Twin { - fn from(twin: DevnetTwin) -> Self { - let entities = twin.entities.into_iter().map(|e| e.into()).collect(); - - Twin { - id: twin.id, - account: twin.account_id, - relay: twin.relay.map(|v| parse_vec_u8!(v.0)), - entities, - pk: twin.pk.map(|v| v.0), - } - } -} - -impl From for EntityProof { - fn from(proof: LocalEntityProof) -> Self { - let signature = parse_vec_u8!(proof.signature); - EntityProof { - entity_id: proof.entity_id, - signature, - } - } -} - -impl From for EntityProof { - fn from(proof: DevnetEntityProof) -> Self { - let signature = parse_vec_u8!(proof.signature); - EntityProof { - entity_id: proof.entity_id, - signature, - } - } -} - -impl From for Twin { - fn from(twin: TestnetTwin) -> Self { - let entities = twin.entities.into_iter().map(|e| e.into()).collect(); - - Twin { - id: twin.id, - account: twin.account_id, - relay: Some(parse_vec_u8!(twin.ip.0 .0)), - entities, - pk: None, - } - } -} - -impl From for EntityProof { - fn from(proof: TestnetEntityProof) -> Self { - let signature = parse_vec_u8!(proof.signature); - EntityProof { - entity_id: proof.entity_id, - signature, - } - } -} - -impl From for Twin { - fn from(twin: MainnetTwin) -> Self { - let entities = twin.entities.into_iter().map(|e| e.into()).collect(); - - Twin { - id: twin.id, - account: twin.account_id, - relay: Some(parse_vec_u8!(twin.ip.0 .0)), - entities, - pk: None, - } - } -} - -impl From for EntityProof { - fn from(proof: MainnetEntityProof) -> Self { - let signature = parse_vec_u8!(proof.signature); - // let signature = String::from_utf8(proof.signature); - EntityProof { - entity_id: proof.entity_id, - signature, - } - } -}