diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1ccfdde27c..e36427e4ae 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,12 +5,12 @@ updates: schedule: interval: weekly ignore: - # these need to be updated together, so dependabot PRs + # these need to be updated together, so dependabot PRs # are just noise. So, ignore them: - dependency-name: sp-core - dependency-name: sp-keyring - dependency-name: sp-runtime - - dependency-name: sp-core-hashing + - dependency-name: sp-crypto-hashing - dependency-name: sp-version - package-ecosystem: github-actions directory: '/' diff --git a/CHANGELOG.md b/CHANGELOG.md index 448ee6af7d..7ece38f02b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,115 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.35.0] - 2024-03-21 + +This release contains several fixes, adds `no_std` support to a couple of crates (`subxt-signer` and `subxt-metadata`) and introduces a few quality of life improvements, which I'll quickly cover: + +### Reworked light client ([#1475](https://github.com/paritytech/subxt/pull/1475)) + +This PR reworks the light client interface. The "basic" usage of connecting to a parachain now looks like this: + +```rust +#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] +pub mod polkadot {} + +use subxt::lightclient::LightClient; + +// Instantiate a light client with the Polkadot relay chain given its chain spec. +let (lightclient, polkadot_rpc) = LightClient::relay_chain(POLKADOT_SPEC)?; +// Connect the light client to some parachain by giving a chain spec for it. +let asset_hub_rpc = lightclient.parachain(ASSET_HUB_SPEC)?; + +// Now, we can create Subxt clients from these Smoldot backed RPC clients: +let polkadot_api = OnlineClient::::from_rpc_client(polkadot_rpc).await?; +let asset_hub_api = OnlineClient::::from_rpc_client(asset_hub_rpc).await?; +``` + +This interface mirrors the requirement that we must connect to a relay chain before we can connect to a parachain. It also moves the light client specific logic into an `RpcClientT` implementation, rather than exposing it as a `subxt::client::LightClient`. + +### Typed Storage Keys ([#1419](https://github.com/paritytech/subxt/pull/1419)) + +This PR changes the storage interface so that, where possible, we now also decode the storage keys as well as the values when iterating over storage entries: + +```rust +#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] +pub mod polkadot {} + +// Create a new API client, configured to talk to Polkadot nodes. +let api = OnlineClient::::new().await?; + +// Build a storage query to iterate over account information. +let storage_query = polkadot::storage().system().account_iter(); + +// Get back an iterator of results (here, we are fetching 10 items at +// a time from the node, but we always iterate over one at a time). +let mut results = api.storage().at_latest().await?.iter(storage_query).await?; + +while let Some(Ok(kv)) = results.next().await { + // We used to get a tuple of key bytes + value. Now we get back a + // `kv` struct containing the bytes and value as well as the actual + // decoded keys: + println!("Decoded key(s): {:?}", kv.keys); + println!("Key bytes: 0x{}", hex::encode(&kv.key_bytes)); + println!("Value: {:?}", kv.value); +} +``` + +When using the static interface, keys come back as a tuple of values corresponding to the different hashers used in constructing the key. When using a dynamic interface, keys will be encoded/decoded from the type given so long as it implements `subxt::storage::StorageKey`, eg `Vec`. + +### Extrinsic Params Refinement ([#1439](https://github.com/paritytech/subxt/pull/1439)) + +Prior to this PR, one could configure extrinsic signed extensions by providing some params like so: + +```rust +// Configure the transaction parameters; we give a small tip and set the +// transaction to live for 32 blocks from the `latest_block` above: +let tx_params = Params::new() + .tip(1_000) + .mortal(latest_block.header(), 32) + .build(); + +let hash = api.tx().sign_and_submit(&tx, &from, tx_params).await?; +``` + +If you want to customize the account nonce, you'd use a different call like `create_signed_with_nonce` instead. + +One of the downsides of the above approach is that, if you don't provide any explicit params, transactions will be immortal by default (because the signed extensions didn't have the information to do any better). + +Now, with the help of a `RefineParams` trait, transactions will default to being mortal and living for 32 blocks unless an explicit mortality is provided as above. + +One notable change is that the offline-only `create_signed_with_nonce` and `create_partial_signed_with_nonce` functions have lost the `_with_nonce` suffix. Since we can't discover nonce/mortality settings offline, you should now provide `Params` and set an explicit nonce (and mortality, if you like) when using these calls, otherwise the nonce will be set to 0 and the mortality to `Immortal`. + +For a full list of changes, please see the following: + +### Added + +- Reworked light client ([#1475](https://github.com/paritytech/subxt/pull/1475)) +- `no_std` compatibility for `subxt-signer` ([#1477](https://github.com/paritytech/subxt/pull/1477)) +- Typed Storage Keys ([#1419](https://github.com/paritytech/subxt/pull/1419)) +- Extrinsic Params Refinement ([#1439](https://github.com/paritytech/subxt/pull/1439)) +- Make storage_page_size for the LegacyBackend configurable ([#1458](https://github.com/paritytech/subxt/pull/1458)) +- `no_std` compatibility for `subxt-metadata` ([#1401](https://github.com/paritytech/subxt/pull/1401)) +- Experimental `reconnecting-rpc-client` ([#1396](https://github.com/paritytech/subxt/pull/1396)) + +### Changed + +- `scale-type-resolver` integration ([#1460](https://github.com/paritytech/subxt/pull/1460)) +- subxt: Derive `std::cmp` traits for subxt payloads and addresses ([#1429](https://github.com/paritytech/subxt/pull/1429)) +- CLI: Return error on wrongly specified type paths ([#1397](https://github.com/paritytech/subxt/pull/1397)) +- rpc v2: chainhead support multiple finalized block hashes in `FollowEvent::Initialized` ([#1476](https://github.com/paritytech/subxt/pull/1476)) +- rpc v2: rename transaction to transactionWatch ([#1399](https://github.com/paritytech/subxt/pull/1399)) + +### Fixed + +- Avoid a panic in case we try decoding naff bytes ([#1444](https://github.com/paritytech/subxt/pull/1444)) +- Fix error mapping to wrong transaction status ([#1445](https://github.com/paritytech/subxt/pull/1445)) +- Update DispatchError to match latest in polkadot-sdk ([#1442](https://github.com/paritytech/subxt/pull/1442)) +- Handle errors when fetching storage keys from Unstablebackend ([#1440](https://github.com/paritytech/subxt/pull/1440)) +- Swap type aliases around to be semantically correct ([#1441](https://github.com/paritytech/subxt/pull/1441)) + ## [0.34.0] - 2024-01-23 - + This release introduces a bunch of features that make subxt easier to use. Let's look at a few of them. ### Codegen - Integrating [`scale-typegen`](https://github.com/paritytech/scale-typegen) and adding type aliases ([#1249](https://github.com/paritytech/subxt/pull/1249)) @@ -23,7 +130,7 @@ If you provide an invalid type path, the macro will tell you so. It also suggest ```rust #[subxt::subxt( - runtime_metadata_path = "metadata.scale", + runtime_metadata_path = "metadata.scale", derive_for_type(path = "Junctions", derive = "Clone") )] pub mod polkadot {} @@ -34,7 +141,7 @@ This gives you a compile-time error like this: ```md Type `Junctions` does not exist at path `Junctions` -A type with the same name is present at: +A type with the same name is present at: xcm::v3::junctions::Junctions xcm::v2::multilocation::Junctions ``` @@ -78,7 +185,7 @@ Our CLI tool now allows you to explore runtime APIs and events ([#1290](https:// # Show details about a runtime API call: subxt explore --url wss://westend-rpc.polkadot.io api StakingAPI nominations_quota # Execute a runtime API call from the CLI: -subxt explore --url wss://westend-rpc.polkadot.io api core version -e +subxt explore --url wss://westend-rpc.polkadot.io api core version -e # Discover what events a pallet can emit: subxt explore --url wss://westend-rpc.polkadot.io pallet Balances events ``` diff --git a/Cargo.lock b/Cargo.lock index 3b7cefb4ef..f374c7f25a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,7 +43,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ "crypto-common", - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -319,12 +319,6 @@ dependencies = [ "nodrop", ] -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - [[package]] name = "arrayvec" version = "0.7.4" @@ -333,7 +327,7 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "artifacts" -version = "0.34.0" +version = "0.35.0" dependencies = [ "substrate-runner", ] @@ -476,13 +470,13 @@ checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -529,6 +523,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base58" version = "0.2.0" @@ -553,15 +553,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "basic-toml" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2db21524cad41c5591204d22d75e1970a2d1f71060214ca931dc7d5afe2c14e5" -dependencies = [ - "serde", -] - [[package]] name = "beef" version = "0.5.2" @@ -586,19 +577,33 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f" dependencies = [ - "bitcoin_hashes", - "rand", - "rand_core 0.6.4", + "bitcoin_hashes 0.11.0", "serde", "unicode-normalization", ] +[[package]] +name = "bitcoin-internals" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" + [[package]] name = "bitcoin_hashes" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" +[[package]] +name = "bitcoin_hashes" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" +dependencies = [ + "bitcoin-internals", + "hex-conservative", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -653,25 +658,13 @@ dependencies = [ "constant_time_eq 0.3.0", ] -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding", - "byte-tools", - "byteorder", - "generic-array 0.12.4", -] - [[package]] name = "block-buffer" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -680,16 +673,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", + "generic-array", ] [[package]] @@ -710,9 +694,9 @@ dependencies = [ [[package]] name = "bounded-collections" -version = "0.1.9" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca548b6163b872067dc5eb82fd130c56881435e30367d2073594a3d9744120dd" +checksum = "d32385ecb91a31bddaf908e8dcf4a15aef1bcd3913cc03ebfad02ff6d568abc1" dependencies = [ "log", "parity-scale-codec", @@ -741,12 +725,6 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - [[package]] name = "byteorder" version = "1.5.0" @@ -780,12 +758,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e53693616d3075149f4ead59bdeecd204ac6b8192d8969757601b74bddf00f" - [[package]] name = "chacha20" version = "0.9.1" @@ -860,9 +832,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.1" +version = "4.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" +checksum = "949626d00e063efc93b6dca932419ceb5432f99769911c0b995f7e884c778813" dependencies = [ "clap_builder", "clap_derive", @@ -870,9 +842,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.1" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", @@ -882,14 +854,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.0" +version = "4.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" +checksum = "90239a040c80f5e14809ca132ddc4176ab33d5e17e49691793296e3fcb34d72f" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -918,9 +890,9 @@ dependencies = [ [[package]] name = "color-eyre" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" +checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" dependencies = [ "backtrace", "color-spantrace", @@ -1122,13 +1094,25 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array 0.14.7", + "generic-array", "rand_core 0.6.4", "typenum", ] @@ -1139,33 +1123,10 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "generic-array 0.14.7", + "generic-array", "subtle", ] -[[package]] -name = "crypto-mac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" -dependencies = [ - "generic-array 0.14.7", - "subtle", -] - -[[package]] -name = "curve25519-dalek" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" -dependencies = [ - "byteorder", - "digest 0.8.1", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - [[package]] name = "curve25519-dalek" version = "3.2.0" @@ -1204,7 +1165,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -1252,7 +1213,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -1274,7 +1235,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core 0.20.8", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -1328,22 +1289,13 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] - [[package]] name = "digest" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -1353,6 +1305,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", + "const-oid", "crypto-common", "subtle", ] @@ -1378,7 +1331,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.48", + "syn 2.0.53", "termcolor", "toml", "walkdir", @@ -1417,6 +1370,21 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "serdect", + "signature", + "spki", +] + [[package]] name = "ed25519" version = "2.2.3" @@ -1476,6 +1444,26 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "serdect", + "subtle", + "zeroize", +] + [[package]] name = "environmental" version = "1.1.4" @@ -1556,7 +1544,7 @@ dependencies = [ "fs-err", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -1569,12 +1557,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - [[package]] name = "fallible-iterator" version = "0.2.0" @@ -1587,6 +1569,16 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "fiat-crypto" version = "0.2.6" @@ -1728,7 +1720,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -1773,22 +1765,13 @@ dependencies = [ [[package]] name = "generate-custom-metadata" -version = "0.34.0" +version = "0.35.0" dependencies = [ "frame-metadata 16.0.0", "parity-scale-codec", "scale-info", ] -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -1797,6 +1780,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -1897,6 +1881,17 @@ dependencies = [ "web-sys", ] +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "h2" version = "0.3.24" @@ -1976,6 +1971,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1997,23 +1998,19 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hex-conservative" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ed443af458ccb6d81c1e7e661545f94d3176752fb1df2f543b902a1e0f51e2" + [[package]] name = "hmac" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" dependencies = [ - "crypto-mac 0.8.0", - "digest 0.9.0", -] - -[[package]] -name = "hmac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" -dependencies = [ - "crypto-mac 0.11.0", + "crypto-mac", "digest 0.9.0", ] @@ -2033,7 +2030,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" dependencies = [ "digest 0.9.0", - "generic-array 0.14.7", + "generic-array", "hmac 0.8.1", ] @@ -2233,7 +2230,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -2259,10 +2256,9 @@ dependencies = [ [[package]] name = "integration-tests" -version = "0.34.0" +version = "0.35.0" dependencies = [ "assert_matches", - "cfg_aliases", "frame-metadata 16.0.0", "futures", "hex", @@ -2276,8 +2272,7 @@ dependencies = [ "subxt-codegen", "subxt-metadata", "subxt-signer", - "subxt-test-proc-macro", - "syn 2.0.48", + "syn 2.0.53", "test-runtime", "tokio", "tracing", @@ -2322,18 +2317,18 @@ checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] [[package]] name = "jsonrpsee" -version = "0.22.1" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16fcc9dd231e72d22993f1643d5f7f0db785737dbe3c3d7ca222916ab4280795" +checksum = "3cdbb7cb6f3ba28f5b212dd250ab4483105efc3e381f5c8bb90340f14f0a2cc3" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -2344,9 +2339,9 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.22.1" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0476c96eb741b40d39dcb39d0124e3b9be9840ec77653c42a0996563ae2a53f7" +checksum = "9ab2e14e727d2faf388c99d9ca5210566ed3b044f07d92c29c3611718d178380" dependencies = [ "futures-channel", "futures-util", @@ -2367,9 +2362,9 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.22.1" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b974d8f6139efbe8425f32cb33302aba6d5e049556b5bfc067874e7a0da54a2e" +checksum = "71962a1c49af43adf81d337e4ebc93f3c915faf6eccaa14d74e255107dfd7723" dependencies = [ "anyhow", "async-lock 3.3.0", @@ -2392,9 +2387,9 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.22.1" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19dc795a277cff37f27173b3ca790d042afcc0372c34a7ca068d2e76de2cb6d1" +checksum = "8c13987da51270bda2c1c9b40c19be0fe9b225c7a0553963d8f17e683a50ce84" dependencies = [ "async-trait", "hyper", @@ -2412,9 +2407,9 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.22.1" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b13dac43c1a9fc2648b37f306b0a5b0e29b2a6e1c36a33b95c1948da2494e9c5" +checksum = "1e53c72de6cd2ad6ac1aa6e848206ef8b736f92ed02354959130373dfa5b3cbd" dependencies = [ "anyhow", "beef", @@ -2425,9 +2420,9 @@ dependencies = [ [[package]] name = "jsonrpsee-ws-client" -version = "0.22.1" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1bbaaf4ce912654081d997ade417c3155727db106c617c0612e85f504c2f744" +checksum = "c8a07ab8da9a283b906f6735ddd17d3680158bb72259e853441d1dd0167079ec" dependencies = [ "http", "jsonrpsee-client-transport", @@ -2436,6 +2431,20 @@ dependencies = [ "url", ] +[[package]] +name = "k256" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "serdect", + "sha2 0.10.8", +] + [[package]] name = "keccak" version = "0.1.5" @@ -2599,18 +2608,6 @@ dependencies = [ "hash-db", ] -[[package]] -name = "merlin" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" -dependencies = [ - "byteorder", - "keccak", - "rand_core 0.5.1", - "zeroize", -] - [[package]] name = "merlin" version = "3.0.0" @@ -2640,9 +2637,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi", @@ -2781,12 +2778,6 @@ version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - [[package]] name = "opaque-debug" version = "0.3.0" @@ -2817,6 +2808,19 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" +[[package]] +name = "parity-bip39" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e69bf016dc406eff7d53a7d3f7cf1c2e72c82b9088aac1118591e36dd2cd3e9" +dependencies = [ + "bitcoin_hashes 0.13.0", + "rand", + "rand_core 0.5.1", + "serde", + "unicode-normalization", +] + [[package]] name = "parity-scale-codec" version = "3.6.9" @@ -2873,21 +2877,23 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "password-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "paste" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" -[[package]] -name = "pbkdf2" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" -dependencies = [ - "crypto-mac 0.11.0", -] - [[package]] name = "pbkdf2" version = "0.12.2" @@ -2895,6 +2901,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", + "password-hash", ] [[package]] @@ -2911,22 +2918,22 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -2996,6 +3003,80 @@ dependencies = [ "plotters-backend", ] +[[package]] +name = "polkavm-common" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c99f7eee94e7be43ba37eef65ad0ee8cbaf89b7c00001c3f6d2be985cb1817" + +[[package]] +name = "polkavm-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d9428a5cfcc85c5d7b9fc4b6a18c4b802d0173d768182a51cc7751640f08b92" + +[[package]] +name = "polkavm-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79fa916f7962348bd1bb1a65a83401675e6fc86c51a0fdbcf92a3108e58e6125" +dependencies = [ + "polkavm-derive-impl-macro 0.8.0", +] + +[[package]] +name = "polkavm-derive" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8c4bea6f3e11cd89bb18bcdddac10bd9a24015399bd1c485ad68a985a19606" +dependencies = [ + "polkavm-derive-impl-macro 0.9.0", +] + +[[package]] +name = "polkavm-derive-impl" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c10b2654a8a10a83c260bfb93e97b262cf0017494ab94a65d389e0eda6de6c9c" +dependencies = [ + "polkavm-common 0.8.0", + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "polkavm-derive-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c4fdfc49717fb9a196e74a5d28e0bc764eb394a2c803eb11133a31ac996c60c" +dependencies = [ + "polkavm-common 0.9.0", + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "polkavm-derive-impl-macro" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e85319a0d5129dc9f021c62607e0804f5fb777a05cdda44d750ac0732def66" +dependencies = [ + "polkavm-derive-impl 0.8.0", + "syn 2.0.53", +] + +[[package]] +name = "polkavm-derive-impl-macro" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ba81f7b5faac81e528eb6158a6f3c9e0bb1008e0ffa19653bc8dea925ecb429" +dependencies = [ + "polkavm-derive-impl 0.9.0", + "syn 2.0.53", +] + [[package]] name = "polling" version = "3.4.0" @@ -3017,7 +3098,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" dependencies = [ "cpufeatures", - "opaque-debug 0.3.0", + "opaque-debug", "universal-hash", ] @@ -3104,9 +3185,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -3233,7 +3314,7 @@ checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -3280,6 +3361,16 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac 0.12.1", + "subtle", +] + [[package]] name = "ring" version = "0.17.7" @@ -3479,38 +3570,38 @@ dependencies = [ [[package]] name = "scale-bits" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "036575c29af9b6e4866ffb7fa055dbf623fe7a9cc159b33786de6013a6969d89" +checksum = "662d10dcd57b1c2a3c41c9cf68f71fb09747ada1ea932ad961aca7e2ca28315f" dependencies = [ "parity-scale-codec", "scale-info", + "scale-type-resolver", "serde", ] [[package]] name = "scale-decode" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7caaf753f8ed1ab4752c6afb20174f03598c664724e0e32628e161c21000ff76" +checksum = "afc79ba56a1c742f5aeeed1f1801f3edf51f7e818f0a54582cac6f131364ea7b" dependencies = [ "derive_more", "parity-scale-codec", "primitive-types", "scale-bits", "scale-decode-derive", - "scale-info", + "scale-type-resolver", "smallvec", ] [[package]] name = "scale-decode-derive" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3475108a1b62c7efd1b5c65974f30109a598b2f45f23c9ae030acb9686966db" +checksum = "5398fdb3c7bea3cb419bac4983aadacae93fe1a7b5f693f4ebd98c3821aad7a5" dependencies = [ "darling 0.14.4", - "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -3518,24 +3609,24 @@ dependencies = [ [[package]] name = "scale-encode" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d70cb4b29360105483fac1ed567ff95d65224a14dd275b6303ed0a654c78de5" +checksum = "628800925a33794fb5387781b883b5e14d130fece9af5a63613867b8de07c5c7" dependencies = [ "derive_more", "parity-scale-codec", "primitive-types", "scale-bits", "scale-encode-derive", - "scale-info", + "scale-type-resolver", "smallvec", ] [[package]] name = "scale-encode-derive" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "995491f110efdc6bea96d6a746140e32bfceb4ea47510750a5467295a4707a25" +checksum = "7a304e1af7cdfbe7a24e08b012721456cc8cecdedadc14b3d10513eada63233c" dependencies = [ "darling 0.14.4", "proc-macro-crate 1.3.1", @@ -3546,9 +3637,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +checksum = "2ef2175c2907e7c8bc0a9c3f86aeb5ec1f3b275300ad58a44d0c3ae379a5e52e" dependencies = [ "bitvec", "cfg-if", @@ -3571,23 +3662,33 @@ dependencies = [ ] [[package]] -name = "scale-typegen" +name = "scale-type-resolver" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00860983481ac590ac87972062909bef0d6a658013b592ccc0f2feb272feab11" +checksum = "10b800069bfd43374e0f96f653e0d46882a2cb16d6d961ac43bea80f26c76843" +dependencies = [ + "scale-info", + "smallvec", +] + +[[package]] +name = "scale-typegen" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6108609f017741c78d35967c7afe4aeaa3999b848282581041428e10d23b63" dependencies = [ "proc-macro2", "quote", "scale-info", - "syn 2.0.48", + "syn 2.0.53", "thiserror", ] [[package]] name = "scale-typegen-description" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae69c1dfd81e9859a5fb42c1b560369e6ed82d2c5b5cb4cac3bba1962a73f017" +checksum = "479f0b8b0d75cce8d284ace5a9b7f5a12c523c94387c710835695e8b194a17bb" dependencies = [ "anyhow", "peekmore", @@ -3603,9 +3704,9 @@ dependencies = [ [[package]] name = "scale-value" -version = "0.13.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58223c7691bf0bd46b43c9aea6f0472d1067f378d574180232358d7c6e0a8089" +checksum = "c07ccfee963104335c971aaf8b7b0e749be8569116322df23f1f75c4ca9e4a28" dependencies = [ "base58", "blake2", @@ -3617,6 +3718,7 @@ dependencies = [ "scale-decode", "scale-encode", "scale-info", + "scale-type-resolver", "serde", "yap", ] @@ -3641,22 +3743,6 @@ dependencies = [ "hashbrown 0.13.2", ] -[[package]] -name = "schnorrkel" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "curve25519-dalek 2.1.3", - "merlin 2.0.1", - "rand_core 0.5.1", - "sha2 0.8.2", - "subtle", - "zeroize", -] - [[package]] name = "schnorrkel" version = "0.11.4" @@ -3668,7 +3754,7 @@ dependencies = [ "arrayvec 0.7.4", "curve25519-dalek 4.1.2", "getrandom_or_panic", - "merlin 3.0.0", + "merlin", "rand_core 0.6.4", "serde_bytes", "sha2 0.10.8", @@ -3692,6 +3778,21 @@ dependencies = [ "untrusted", ] +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "serdect", + "subtle", + "zeroize", +] + [[package]] name = "secp256k1" version = "0.28.2" @@ -3786,7 +3887,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -3809,6 +3910,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + [[package]] name = "sha-1" version = "0.9.8" @@ -3819,19 +3930,7 @@ dependencies = [ "cfg-if", "cpufeatures", "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "sha2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" -dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", + "opaque-debug", ] [[package]] @@ -3844,7 +3943,7 @@ dependencies = [ "cfg-if", "cpufeatures", "digest 0.9.0", - "opaque-debug 0.3.0", + "opaque-debug", ] [[package]] @@ -3892,6 +3991,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ + "digest 0.10.7", "rand_core 0.6.4", ] @@ -3967,19 +4067,19 @@ dependencies = [ "itertools 0.12.1", "libm", "libsecp256k1", - "merlin 3.0.0", + "merlin", "no-std-net", "nom", "num-bigint", "num-rational", "num-traits", - "pbkdf2 0.12.2", + "pbkdf2", "pin-project", "poly1305", "rand", "rand_chacha", "ruzstd", - "schnorrkel 0.11.4", + "schnorrkel", "serde", "serde_json", "sha2 0.10.8", @@ -4057,9 +4157,9 @@ dependencies = [ [[package]] name = "sp-application-crypto" -version = "30.0.0" +version = "33.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4fe7a9b7fa9da76272b201e2fb3c7900d97d32a46b66af9a04dad457f73c71" +checksum = "13ca6121c22c8bd3d1dce1f05c479101fd0d7b159bef2a3e8c834138d839c75c" dependencies = [ "parity-scale-codec", "scale-info", @@ -4071,9 +4171,9 @@ dependencies = [ [[package]] name = "sp-arithmetic" -version = "23.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f42721f072b421f292a072e8f52a3b3c0fbc27428f0c9fe24067bc47046bad63" +checksum = "910c07fa263b20bf7271fdd4adcb5d3217dfdac14270592e0780223542e7e114" dependencies = [ "integer-sqrt", "num-traits", @@ -4086,12 +4186,11 @@ dependencies = [ [[package]] name = "sp-core" -version = "28.0.0" +version = "31.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f230cb12575455070da0fc174815958423a0b9a641d5e304a9457113c7cb4007" +checksum = "26d7a0fd8f16dcc3761198fc83be12872f823b37b749bc72a3a6a1f702509366" dependencies = [ "array-bytes", - "bip39", "bitflags 1.3.2", "blake2", "bounded-collections", @@ -4103,20 +4202,22 @@ dependencies = [ "hash256-std-hasher", "impl-serde", "itertools 0.10.5", + "k256", "libsecp256k1", "log", - "merlin 3.0.0", + "merlin", + "parity-bip39", "parity-scale-codec", "parking_lot", "paste", "primitive-types", "rand", "scale-info", - "schnorrkel 0.11.4", + "schnorrkel", "secp256k1", "secrecy", "serde", - "sp-core-hashing", + "sp-crypto-hashing", "sp-debug-derive", "sp-externalities", "sp-runtime-interface", @@ -4131,10 +4232,10 @@ dependencies = [ ] [[package]] -name = "sp-core-hashing" -version = "15.0.0" +name = "sp-crypto-hashing" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0f4990add7b2cefdeca883c0efa99bb4d912cb2196120e1500c0cc099553b0" +checksum = "bc9927a7f81334ed5b8a98a4a978c81324d12bd9713ec76b5c68fd410174c5eb" dependencies = [ "blake2b_simd", "byteorder", @@ -4152,14 +4253,14 @@ checksum = "48d09fa0a5f7299fb81ee25ae3853d26200f7a348148aed6de76be905c007dbe" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] name = "sp-externalities" -version = "0.25.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63867ec85950ced90d4ab1bba902a47db1b1efdf2829f653945669b2bb470a9c" +checksum = "a1d6a4572eadd4a63cff92509a210bf425501a0c5e76574b30a366ac77653787" dependencies = [ "environmental", "parity-scale-codec", @@ -4169,18 +4270,20 @@ dependencies = [ [[package]] name = "sp-io" -version = "30.0.0" +version = "33.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55f26d89feedaf0faf81688b6e1e1e81329cd8b4c6a4fd6c5b97ed9dd068b8a" +checksum = "3e09bba780b55bd9e67979cd8f654a31e4a6cf45426ff371394a65953d2177f2" dependencies = [ "bytes", "ed25519-dalek", "libsecp256k1", "log", "parity-scale-codec", + "polkavm-derive 0.9.1", "rustversion", "secp256k1", "sp-core", + "sp-crypto-hashing", "sp-externalities", "sp-keystore", "sp-runtime-interface", @@ -4194,9 +4297,9 @@ dependencies = [ [[package]] name = "sp-keyring" -version = "31.0.0" +version = "34.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98165ce7c625a8cdb88d39c6bbd56fe8b32ada64ed0894032beba99795f557da" +checksum = "a07a31da596d705b3a3458d784a897af7fd2f8090de436dc386a112e8ea7f34f" dependencies = [ "sp-core", "sp-runtime", @@ -4205,15 +4308,14 @@ dependencies = [ [[package]] name = "sp-keystore" -version = "0.34.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96806a28a62ed9ddecd0b28857b1344d029390f7c5c42a2ff9199cbf5638635c" +checksum = "bdbab8b61bd61d5f8625a0c75753b5d5a23be55d3445419acd42caf59cf6236b" dependencies = [ "parity-scale-codec", "parking_lot", "sp-core", "sp-externalities", - "thiserror", ] [[package]] @@ -4229,9 +4331,9 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "31.0.1" +version = "34.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3bb49a4475d390198dfd3d41bef4564ab569fbaf1b5e38ae69b35fc01199d91" +checksum = "ec3cb126971e7db2f0fcf8053dce740684c438c7180cfca1959598230f342c58" dependencies = [ "docify", "either", @@ -4254,13 +4356,14 @@ dependencies = [ [[package]] name = "sp-runtime-interface" -version = "24.0.0" +version = "26.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f66b66d8cec3d785fa6289336c1d9cbd4305d5d84f7134378c4d79ed7983e6fb" +checksum = "e48a675ea4858333d4d755899ed5ed780174aa34fec15953428d516af5452295" dependencies = [ "bytes", "impl-trait-for-tuples", "parity-scale-codec", + "polkavm-derive 0.8.0", "primitive-types", "sp-externalities", "sp-runtime-interface-proc-macro", @@ -4273,23 +4376,23 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "17.0.0" +version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfaf6e85b2ec12a4b99cd6d8d57d083e30c94b7f1b0d8f93547121495aae6f0c" +checksum = "0195f32c628fee3ce1dfbbf2e7e52a30ea85f3589da9fe62a8b816d70fc06294" dependencies = [ "Inflector", "expander", "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] name = "sp-state-machine" -version = "0.35.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718c779ad1d6fcc0be64c7ce030b33fa44b5c8914b3a1319ef63bb5f27fb98df" +checksum = "1eae0eac8034ba14437e772366336f579398a46d101de13dbb781ab1e35e67c5" dependencies = [ "hash-db", "log", @@ -4315,9 +4418,9 @@ checksum = "12f8ee986414b0a9ad741776762f4083cd3a5128449b982a3919c4df36874834" [[package]] name = "sp-storage" -version = "19.0.0" +version = "20.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb92d7b24033a8a856d6e20dd980b653cbd7af7ec471cc988b1b7c1d2e3a32b" +checksum = "8dba5791cb3978e95daf99dad919ecb3ec35565604e88cd38d805d9d4981e8bd" dependencies = [ "impl-serde", "parity-scale-codec", @@ -4342,9 +4445,9 @@ dependencies = [ [[package]] name = "sp-trie" -version = "29.0.0" +version = "32.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e4d24d84a0beb44a71dcac1b41980e1edf7fb722c7f3046710136a283cd479b" +checksum = "f1aa91ad26c62b93d73e65f9ce7ebd04459c4bad086599348846a81988d6faa4" dependencies = [ "ahash 0.8.8", "hash-db", @@ -4381,9 +4484,9 @@ dependencies = [ [[package]] name = "sp-weights" -version = "27.0.0" +version = "30.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e874bdf9dd3fd3242f5b7867a4eaedd545b02f29041a46d222a9d9d5caaaa5c" +checksum = "9af6c661fe3066b29f9e1d258000f402ff5cc2529a9191972d214e5871d0ba87" dependencies = [ "bounded-collections", "parity-scale-codec", @@ -4474,7 +4577,7 @@ version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "rustversion", @@ -4483,20 +4586,20 @@ dependencies = [ [[package]] name = "substrate-bip39" -version = "0.4.5" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e620c7098893ba667438b47169c00aacdd9e7c10e042250ce2b60b087ec97328" +checksum = "a2b564c293e6194e8b222e52436bcb99f60de72043c7f845cf6c4406db4df121" dependencies = [ - "hmac 0.11.0", - "pbkdf2 0.8.0", - "schnorrkel 0.9.1", - "sha2 0.9.9", + "hmac 0.12.1", + "pbkdf2", + "schnorrkel", + "sha2 0.10.8", "zeroize", ] [[package]] name = "substrate-runner" -version = "0.34.0" +version = "0.35.0" [[package]] name = "subtle" @@ -4506,7 +4609,7 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "subxt" -version = "0.34.0" +version = "0.35.0" dependencies = [ "assert_matches", "async-trait", @@ -4533,7 +4636,7 @@ dependencies = [ "serde", "serde_json", "sp-core", - "sp-core-hashing", + "sp-crypto-hashing", "sp-keyring", "sp-runtime", "subxt-lightclient", @@ -4542,22 +4645,20 @@ dependencies = [ "subxt-signer", "thiserror", "tokio", - "tokio-stream", "tokio-util", "tracing", "tracing-subscriber 0.3.18", "url", - "wasm-bindgen-futures", ] [[package]] name = "subxt-cli" -version = "0.34.0" +version = "0.35.0" dependencies = [ - "clap 4.5.1", + "clap 4.5.3", "color-eyre", "frame-metadata 16.0.0", - "heck", + "heck 0.4.1", "hex", "indoc", "jsonrpsee", @@ -4574,18 +4675,18 @@ dependencies = [ "subxt", "subxt-codegen", "subxt-metadata", - "syn 2.0.48", + "syn 2.0.53", "thiserror", "tokio", ] [[package]] name = "subxt-codegen" -version = "0.34.0" +version = "0.35.0" dependencies = [ "frame-metadata 16.0.0", "getrandom", - "heck", + "heck 0.4.1", "hex", "jsonrpsee", "parity-scale-codec", @@ -4594,16 +4695,15 @@ dependencies = [ "scale-info", "scale-typegen", "subxt-metadata", - "syn 2.0.48", + "syn 2.0.53", "thiserror", "tokio", ] [[package]] name = "subxt-lightclient" -version = "0.34.0" +version = "0.35.0" dependencies = [ - "either", "futures", "futures-timer", "futures-util", @@ -4627,7 +4727,7 @@ dependencies = [ [[package]] name = "subxt-macro" -version = "0.34.0" +version = "0.35.0" dependencies = [ "darling 0.20.8", "parity-scale-codec", @@ -4635,12 +4735,12 @@ dependencies = [ "quote", "scale-typegen", "subxt-codegen", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] name = "subxt-metadata" -version = "0.34.0" +version = "0.35.0" dependencies = [ "assert_matches", "bitvec", @@ -4650,41 +4750,33 @@ dependencies = [ "hashbrown 0.14.3", "parity-scale-codec", "scale-info", - "sp-core-hashing", + "sp-crypto-hashing", ] [[package]] name = "subxt-signer" -version = "0.34.0" +version = "0.35.0" dependencies = [ "bip39", + "cfg-if", + "derive_more", "getrandom", "hex", "hmac 0.12.1", "parity-scale-codec", - "pbkdf2 0.12.2", + "pbkdf2", "regex", - "schnorrkel 0.11.4", + "schnorrkel", "secp256k1", "secrecy", "sha2 0.10.8", "sp-core", - "sp-core-hashing", + "sp-crypto-hashing", "sp-keyring", "subxt", - "thiserror", "zeroize", ] -[[package]] -name = "subxt-test-proc-macro" -version = "0.34.0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - [[package]] name = "syn" version = "1.0.109" @@ -4698,9 +4790,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" dependencies = [ "proc-macro2", "quote", @@ -4730,7 +4822,7 @@ dependencies = [ [[package]] name = "test-runtime" -version = "0.34.0" +version = "0.35.0" dependencies = [ "hex", "impl-serde", @@ -4752,22 +4844,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -4830,7 +4922,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -5005,7 +5097,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -5126,17 +5218,17 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "trybuild" -version = "1.0.89" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a9d3ba662913483d6722303f619e75ea10b7855b0f8e0d72799cf8621bb488f" +checksum = "2aa6f84ec205ebf87fb7a0abdbcd1467fa5af0e86878eb6d888b78ecbb10b6d5" dependencies = [ - "basic-toml", "glob 0.3.1", "once_cell", "serde", "serde_derive", "serde_json", "termcolor", + "toml", ] [[package]] @@ -5159,7 +5251,7 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ui-tests" -version = "0.34.0" +version = "0.35.0" dependencies = [ "frame-metadata 16.0.0", "generate-custom-metadata", @@ -5349,9 +5441,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -5359,24 +5451,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -5386,9 +5478,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5396,22 +5488,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "wasmi" @@ -5597,9 +5689,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -5924,7 +6016,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -5944,5 +6036,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.53", ] diff --git a/Cargo.toml b/Cargo.toml index 16bb64831f..b01a0ecb7b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,13 +19,20 @@ members = [ # We exclude any crates that would depend on non mutually # exclusive feature flags and thus can't compile with the # workspace: -exclude = ["testing/no-std-tests", "testing/wasm-rpc-tests", "testing/wasm-lightclient-tests", "signer/wasm-tests", "examples/wasm-example", "examples/parachain-example"] +exclude = [ + "testing/no-std-tests", + "testing/wasm-rpc-tests", + "testing/wasm-lightclient-tests", + "signer/wasm-tests", + "examples/wasm-example", + "examples/parachain-example" +] resolver = "2" [workspace.package] authors = ["Parity Technologies "] edition = "2021" -version = "0.34.0" +version = "0.35.0" rust-version = "1.74.0" license = "Apache-2.0 OR GPL-3.0" repository = "https://github.com/paritytech/subxt" @@ -52,55 +59,56 @@ type_complexity = "allow" all = "deny" [workspace.dependencies] -async-trait = "0.1.74" +async-trait = "0.1.79" assert_matches = "1.5.0" base58 = { version = "0.2.0" } bitvec = { version = "1", default-features = false } blake2 = { version = "0.10.6", default-features = false } -clap = { version = "4.5.1", features = ["derive", "cargo"] } +clap = { version = "4.5.3", features = ["derive", "cargo"] } +cfg-if = "1.0.0" criterion = "0.4" codec = { package = "parity-scale-codec", version = "3.6.9", default-features = false } -color-eyre = "0.6.1" +color-eyre = "0.6.3" console_error_panic_hook = "0.1.7" darling = "0.20.8" derivative = "2.2.0" derive_more = "0.99.17" -either = "1.10.0" +either = { version = "1.10.0", default-features = false } frame-metadata = { version = "16.0.0", default-features = false } futures = { version = "0.3.30", default-features = false, features = ["std"] } getrandom = { version = "0.2", default-features = false } hashbrown = "0.14.3" -hex = "0.4.3" +hex = { version = "0.4.3", default-features = false } heck = "0.4.1" -impl-serde = { version = "0.4.0" } +impl-serde = { version = "0.4.0", default-features = false } indoc = "2" jsonrpsee = { version = "0.22" } pretty_assertions = "1.4.0" -primitive-types = { version = "0.12.2", default-features = false, features = ["codec", "scale-info", "serde"] } +primitive-types = { version = "0.12.2", default-features = false } proc-macro-error = "1.0.4" -proc-macro2 = "1.0.78" +proc-macro2 = "1.0.79" quote = "1.0.35" -regex = "1.10.3" -scale-info = { version = "2.10.0", default-features = false } -scale-value = "0.13.0" -scale-bits = "0.4.0" -scale-decode = "0.10.0" -scale-encode = "0.5.0" -serde = { version = "1.0.197" } -serde_json = { version = "1.0.114" } +regex = { version = "1.10.3", default-features = false } +scale-info = { version = "2.11.0", default-features = false } +scale-value = { version = "0.14.1", default-features = false } +scale-bits = { version = "0.5.0", default-features = false } +scale-decode = { version = "0.11.1", default-features = false } +scale-encode = { version = "0.6.0", default-features = false } +serde = { version = "1.0.197", default-features = false, features = ["derive"] } +serde_json = { version = "1.0.114", default-features = false } syn = { version = "2.0.15", features = ["full", "extra-traits"] } -thiserror = "1.0.57" +thiserror = "1.0.58" tokio = { version = "1.36", default-features = false } -tracing = "0.1.40" +tracing = { version = "0.1.40", default-features = false } tracing-wasm = "0.2.1" tracing-subscriber = "0.3.18" -trybuild = "1.0.89" +trybuild = "1.0.90" url = "2.5.0" wabt = "0.10.0" wasm-bindgen-test = "0.3.24" which = "5.0.0" -scale-typegen-description = "0.1.0" -scale-typegen = "0.1.1" +scale-typegen-description = "0.2.0" +scale-typegen = "0.2.0" strip-ansi-escapes = "0.2.0" # Light client support: @@ -109,42 +117,42 @@ smoldot-light = { version = "0.14.0", default-features = false } tokio-stream = "0.1.14" futures-util = "0.3.30" rand = "0.8.5" -pin-project = "1.1.4" +pin-project = "1.1.5" # Light client wasm: -web-sys = { version = "0.3.67", features = ["BinaryType", "CloseEvent", "MessageEvent", "WebSocket"] } -wasm-bindgen = "0.2.90" +web-sys = { version = "0.3.69", features = ["BinaryType", "CloseEvent", "MessageEvent", "WebSocket"] } +wasm-bindgen = "0.2.92" send_wrapper = "0.6.0" -js-sys = "0.3.68" -wasm-bindgen-futures = "0.4.38" +js-sys = "0.3.69" +wasm-bindgen-futures = "0.4.42" futures-timer = "3" instant = { version = "0.1.12", default-features = false } tokio-util = "0.7.10" # Substrate crates: -sp-core = { version = "28.0.0", default-features = false } -sp-core-hashing = { version = "15.0.0", default-features = false } -sp-runtime = "31.0.0" -sp-keyring = "31.0.0" +sp-core = { version = "31.0.0", default-features = false } +sp-crypto-hashing = { version = "0.1.0", default-features = false } +sp-runtime = "34.0.0" +sp-keyring = "34.0.0" # Subxt workspace crates: -subxt = { version = "0.34.0", path = "subxt", default-features = false } -subxt-macro = { version = "0.34.0", path = "macro" } -subxt-metadata = { version = "0.34.0", path = "metadata" } -subxt-codegen = { version = "0.34.0", path = "codegen" } -subxt-signer = { version = "0.34.0", path = "signer" } -subxt-lightclient = { version = "0.34.0", path = "lightclient", default-features = false } +subxt = { version = "0.35.0", path = "subxt", default-features = false } +subxt-macro = { version = "0.35.0", path = "macro" } +subxt-metadata = { version = "0.35.0", path = "metadata", default-features = false } +subxt-codegen = { version = "0.35.0", path = "codegen" } +subxt-signer = { version = "0.35.0", path = "signer", default-features = false } +subxt-lightclient = { version = "0.35.0", path = "lightclient", default-features = false } test-runtime = { path = "testing/test-runtime" } substrate-runner = { path = "testing/substrate-runner" } # subxt-signer deps that I expect aren't useful anywhere else: -bip39 = "2.0.0" -hmac = "0.12.1" +bip39 = { version = "2.0.0", default-features = false } +hmac = { version = "0.12.1", default-features = false } pbkdf2 = { version = "0.12.2", default-features = false } -schnorrkel = "0.11.4" -secp256k1 = "0.28.2" +schnorrkel = { version = "0.11.4", default-features = false } +secp256k1 = { version = "0.28.2", default-features = false } secrecy = "0.8.0" -sha2 = "0.10.8" +sha2 = { version = "0.10.8", default-features = false } zeroize = { version = "1", default-features = false } [profile.dev.package.smoldot-light] diff --git a/artifacts/demo_chain_specs/polkadot.json b/artifacts/demo_chain_specs/polkadot.json index a24aa92599..74ce0faa6e 100644 --- a/artifacts/demo_chain_specs/polkadot.json +++ b/artifacts/demo_chain_specs/polkadot.json @@ -43,10 +43,10 @@ }, "id": "polkadot", "lightSyncState": { - "babeEpochChanges": "0x0499ed11844881f9a3e6791b1032a0e229db03a40fd8c5634cbacc85757c3c1b92abaf2b010173eef91000000000d3f7f9100000000004651bd04476837746eaf45e4269c11d1ae31c02468cf50d968b347db96ec3b198f8b82b0101d3f7f910000000003301fa100000000004440a975e0d61ca352b2acd649ebaa94d6c42695ce0ee438c627abe2c518171a352c22b01013301fa1000000000930afa100000000000000c440a975e0d61ca352b2acd649ebaa94d6c42695ce0ee438c627abe2c518171a352c22b01011f200000000000003301fa10000000006009000000000000a50432904ec260963195582a1d339f9fbd2d5d76f551160105c922423cad0d94482f010000000000000076441c448aefcf40a72128edc9b44a4f7ef9c267c503e98f5f9c72d5e9e92f000100000000000000526e055ade4ac425e9b5f93ce4394601335d3599a5b742603126d78ce99a4a54010000000000000072ab87b654d80294c876cbefb534b3344c2f64159b015b89221331ec214541750100000000000000643fa48931f2331b61ce9664acef49522251d1e671490d50d48aebdab81c2b3101000000000000008008c1b7061a2402634fc15d3849e2913863beb9f55024bc8cc7fa7d6e397817010000000000000024a51a9bdb67213626d1b52bd8dbc0e9b94ea88ea417aa17b56212d1cea3e1780100000000000000488d520146f681678e9d229f5e29354edf65e521246b28a4175c0502e060b9200100000000000000503cafb91c14eaa2931c4507090b27170b90a2a76d3cd4669f922202c781fc350100000000000000c681c1acaa82eddba6e394ddc9a2fd1af34418448d544c34966a31c837667f28010000000000000020352ba0565811731625a8001d26f5d899e5856dedd0f9c6bc3bec2995704e5b01000000000000009cb389c209afbebda2b12113e0266b3d30f46e2a91aaf4451c193d640288357101000000000000004c9886e2e62ee92a6778d6a7928052732044b64fa61969cd8e37f3f7e3406f720100000000000000c056f1879c1fd443e38244c26ef138218b3e43e70b1cb84bd7242e354cc9ee0e010000000000000028cbfe245b9eec3bf55d8d249ab3680490644aa23a7b688e00478e7fcb0fe02901000000000000003ed19f8df1a2d2c1176df07baff4206c94f4d752de6a46c5f3f34264a88b0a0701000000000000005237e4509f24bc9e8bf9bfd78b594219d86853ae16601f692f10c9b16b88f83b0100000000000000e07afc6e4b429df62183d1e1c417703cf8467e0f1bc61f7e33954d8336c7a935010000000000000098192016f83ef2fe74dba1ecc6526efc61b79f3177c00dc7c053160391858f700100000000000000f6dddaaaa53b57763610037753656b591d90fa81efbadcabbeddf7378c23602701000000000000003e69835397599a4bf081775f9f42f0f4ee686d67c9af8eacc4a733fdcdb0290b0100000000000000f8a681118ea0bb9dfde2813ce5144eeb5cee881c27883de1c0c759255ec32654010000000000000000b84e6e296de1009aeca95ee09bc5173aec6e91b1145b247d69e477588789720100000000000000e67c524e443cda4cd27dfcce70488a5d23a93c8c46a5e83ef5a69eff3a02fa5a010000000000000024a57db63b380456d56d561d8a9da6db13d298045c9672bc4086a2e0a567d55c01000000000000006c50859d9dde209012eb3868c1a3a6e80ae8fa528ace9df68e92dbbae60368200100000000000000a8e470f2339e3ed0da456780dd9207e9c6a02459238ec3057a6ade01fd6cd60a01000000000000007c5f58a83f8101943c089dba3ab906c07811e853444aa58dbcc986c4095fbe7c01000000000000005494142902284943201b7cf610306e8665eeeec87c014d607175c3f50f76103b010000000000000072ed7192625403acef94aa9189f9f179deb89e60478816ca96c79b742f757e750100000000000000b4ffe3c5959ff37c11c6f19d91926cb97aa4bf0f604919e1753bb55664d061680100000000000000bc4c9b5425f9a2aa09e3239332c702dedbfffa2b9f4cc1b978b307fc1fa1337c0100000000000000e07d5b19d98a6f8ef5c964b507fcd88f500a2a0a9afd5cffe9d4e3f74d83b27f01000000000000004e2753547f6ec0a896bcbc55b9eeab875e8019acdeb10b979210af63f24c4b74010000000000000042e7851b82d8b7722b9eeb5eead57b21bf533fd25acb10542a52889376fc3920010000000000000028ce9c093ac772f56acb8dfe8b33a3966d4b8699bd41814117352d397195bd5f010000000000000042ad4ba7e8a60af1abcee04fdd82ad02b24f1e2535bdb1abcdde886efbf0fc4301000000000000006ec27dfa7ac9d35eb002c55d3e4d56b4df928dd5c44323ac228305741c9e09360100000000000000b89cbc83a386d6f5d4fed93289ee50fdf69d77369ca0c9a8b962554e3fc0d37e0100000000000000e61da4eefdd14434952c58dd1943f7f63185d03321ccc8835e4216badd16fc190100000000000000722d7d57085c250af633f2d461874d59aebc8021eb1112ec8805db5ddea53e5a0100000000000000a20797f3a8669a909adb22a3aee2844dba82d231cc33f5d9be0e2c533cb82a6701000000000000006a1274b6748bf822ba80c9a9416abd3cf591b7aee6adabb8359b7dbed8ebb3770100000000000000dc1274e0689c7a3eac31b41ce352719529e65c01f26999f74ce17c9905fce87401000000000000009c9bc1074cf465c0dd39f74bfdf16a67f81339ba2ad117a0c7030b4f067877170100000000000000d8b38c77823eb1912bf8b743cca6c655ea1844ee468fbd78b394bf222bf8bc2001000000000000009a6223b8a7aac3a28f958d9f6c6abf55f87a38cd22fa563d6327a4d86da7b64d01000000000000006ca924ff8f8e69b8ea54dc988c67fbfc1d955f357f01e5ff4b8362ad7d756c3701000000000000009e280c8deea88069fe5118eefbb994d01373ff5dc213a65d06e6873b528f6c2f01000000000000002834c706b030a82a81ec43e2faf26a7d00392e1d8f2de8b7a876183ab612cb180100000000000000d0189a530b4048501596c4530054fe89f017360402da0ac197a8100ac693b06e010000000000000006ced0dafbe316bc507cfa57f506a58ad57ba7a69a8291ef87e8f0f5dceff6040100000000000000364360b4881f0f2831a226a422c79348776d43a2365dd636dea05a09381f8c2e01000000000000009092f9e937617716876caae2eee008bd44b0d0ed3f3af47073dcab55fcb1d5740100000000000000a86c7bdf11794e554439b09f9f294c8e0abaebf447c7bc54419434b8b95f864901000000000000009e9f565a8cb6e8f2154a9833735930a04003505856c3743a0f71afe64c7acf710100000000000000b6397b9e34e46715868bbaa83cb67dec4d78ce992f4a9c973e6fc1e2dde3d76b010000000000000028a027ca1c0bdeebfc8fce85ac4bac48cc072523d9c4a86b4f2594f9142e7e3b010000000000000042e4c41a899dfb238649e5b17dc232c2699353635d60e6a3bdcd71f9b82cda300100000000000000ce4bfd8c5611b1637066ef9e579c85efadfc9513b882184e00b75871ef7f5a2d01000000000000005c0419f37036f2bf999f3958b49f63ab19d6dc19847a393dfd26cf303fc8d911010000000000000028558e46037c51ece4d39a8a4d34688662e629413c221d6226afe454240e70210100000000000000e8308668e9f16683cc739791a6dd530b819f45e4ade2113ee2f27eed1c51d1200100000000000000e41b3ecad757b0a5ecbc6b29691681df25b3d2b5f1ea325b648e607a5d76cf080100000000000000be03fe6bc03a7884524047567a8ccf43b3c988bf3b447ca9e1520d1c1f83c53901000000000000005461977495f9c407a8d951e860a1cb2087592103229bdbd879629cc538a4182b010000000000000026d421de2e7251020ac2f8b8c7e348aa904dcaf0b6d5d73fa0113b476f7dd9030100000000000000bc56c07cea21bcbbe058aedd2ced9fb4757caead55f96bda9bed1c9669c32b64010000000000000078e1a4fecbaac940c04e0b591a01ea66a574b5098852ded2810e3a534971111f01000000000000006ccf2ce8e149999a7bb996faa65194e60aeb7bcd1937c787f886fe979fb49e6601000000000000004e5b37f3ecd0fb3131aba488083c145d60b924ef98b286a0066e0ded309e886b01000000000000001e866bed92016cd2dcabe2d87fcaf8c1d7248255cafb9e10638fc3a2b476221b0100000000000000946071eab9c0fa1de9be2ad3c18041f1326faab41d84d9daf9f89c0daf9c0f00010000000000000082b820c5bee8ee77e35203dab387f3434b8502e5f1c35dfb2ad15b5c89d47b3c01000000000000001cf3446b4b5116a1784d92cdc5101e55a5fb91ed3d93efccd06b304a94362d0a0100000000000000c6d5dc6e1ec83491397390449d8cddaa88631e8855efe50697788a93de00fb5501000000000000003a4b0919068523aa04ab29f1b49bdc03a176a4b93f9b5a7e6e0cdcc8318691030100000000000000b288a9832e07bef83c5a8ca72c5a5583b321672ba7c6cdd44a971f855d32d95c0100000000000000d04077347325618eb5cef03729a157b910fac54ec7e344e65b6945fb9fbbeb3b0100000000000000fe3b55d17e25c44a3568885d9d37276df81fa5225d9d73ee67321c7826581b5a0100000000000000faa52c51af82fe8fcdde5ffa213721a8395acf22e30bbd2aa420626571e6183d010000000000000040a2527ffa7d30d788eca127d435c8b5aa48972cda538b9a1627a57e85c8fa190100000000000000844b691aa95ff9a15b50f5e5f4f0e582db6621326cf18d7533f55bc27549497a01000000000000009c1863aefa0b4d5f3d48275769ad0ed04e1428db9694d83b9bb8b5d833f1b41101000000000000007c4b93d862704aad434ab3dc2cbef824df738c5dbe1ba7b34daa38b2aabf7c36010000000000000028e972febaf463f22d1108053e7c26ccde1e6018d7c302985bc227557e0a663b0100000000000000261ac3229b4bb7a376c37f17e287b2eb596d3b478370b722b6b41443d8708132010000000000000080413d2894759b53a03874bf96ffcb66117e4a08ad7f159c008f2b3b6cfcbb470100000000000000ea885fca10a9473631bcca2549cb8183beef534a7ee2bd59a0a6f74d97bcfc4401000000000000001a36d936f4692ac8387ac0ca1f051970ae480271e39fc134436b86b8ec83b25d010000000000000026d7422872cbf4d4918046f240a13a37219a272f4326b3f3bd1249829bbcd12b0100000000000000be6106f9217a1847af66de9510fdfb40514409556506ddc1c1a897818434125b0100000000000000e03dd3bbb140ffa44e0cc0e1846967b03aecccac78f6e2e0a1fd3ac0d34f554a0100000000000000ae2e94f092fbcfe263519f950b5ade09c474258a4e0d5e62570d02b3f71d85480100000000000000bca6409d6d7e4f94ce797594db4363bb8bebd5387770aee0bb7663b36354fe2a010000000000000088b8e0da91c48fd9bf94ca5ed7fb74797a037e626c98ac18cd76360ccd6ac11c010000000000000086c1922e4ed392d72e0fbc0ee28e7ec0a8ba2b33470330a606cec9a159a796260100000000000000344589372873125fd660e2ff3ad9bf67230f9306acccaea070aed322a8ede264010000000000000036465f4be77147914969ea78f8e39610310679011dfbb6137dab12e18a687a52010000000000000098cd0a4eae6f560a9e760f8b806b36861b805798b4ee0ada29f6841855d51d030100000000000000584bf60b8b17ddaf70f87f371bd2b425a3637e05c1b75469f45ea85717063b6901000000000000004c5e6997b6f186855b1f4c9f8ab2d6cea3da2e86445605ab89e5b5821e05bd3d0100000000000000f85f12f4fb92075bc59a1711f35e8f3c8313ff08028d2af80a79b3682a3785590100000000000000f8db92b1e5f6e9a7f23435a2aadab56d5ab7746c978965d924de2f89ef063c21010000000000000004ba7eb24012b133b20a8021b603a1483c4a5b9ad3415a4d7ca2b1ad625719550100000000000000202e3405e49bb882f1d49efc4a4adc5b62dcc96ec18346a48aad5a510c189b5001000000000000005c39533cbb607f1f52d82356d267a56399045e0d7b7e95887cfd8ec13173db2e0100000000000000b045bf0235bbe708e4d6918758650c9c7f9ab4d638e4a841807ed7c82ff7f63a0100000000000000ea6acde5149e930af7bc3b17b7f0bdcf12dfd3dc3437f774f823bbeef420a97201000000000000006e7a78e9fdfe275f3e000382ba30452729970578258839db6c0fc568e20b35150100000000000000800dd25a7aea3fd7359065185cb35b4a2fad0b81b3d58de638e6764dc8a8211d01000000000000004e1b48e67c1e62e46add39fa523b956946228ea0f08bd9d20ced798cfc9a0f5b0100000000000000faa6ae896c2d1040e495acbdcd8d90a02ccb17ba6e507efa2f7deacb3b28466e0100000000000000840290d318350bff32db3dcf6138b822cb2adf1dedf5bad8729471988955915c0100000000000000907ff7ac1e6c451d236c05c8d3f85640d9f9472d6a30115fc26135dae020e638010000000000000014e2f25dd3376eb7978d413c14322704a2ff3d9c0c2971acdcdf9720c2c13d6b010000000000000014cf97e739cfd033c2828f25ad3f15e8f6ef62ba97dd74164e77e61eb85454260100000000000000a07f151db53097c2da9dac4b2e0f194931a677a3ba99df0f3976e34409fd64760100000000000000d8faee17dcc461acb22ca1720b86385414ea8810ba31509fbd8da8733029eb1901000000000000004cc9ff5edb36e361b088b0eff52fc6e6559c1169ff87ccdb62503bceab7c74450100000000000000f820a8ed2c97f639fea2892d0a89ae98ffc4c0054f948f9a0108e4d99f89994c0100000000000000fcd5f4c4fe11f20ad99dc8345b7dc5600caba5d5b7d3f499c3253c095152d45401000000000000005eac8ac37c95fc11921839550a30ef071bbc80fb10ea1482cc67818e184d544a0100000000000000ea2b17bd1b69a7b442dd000db0f12f0bd4bf7a87a540427986bd32f3d3bd55580100000000000000142445d894c1236a38c6b1bcd9f5a7245897026424ce9544002008a7702c3b1d0100000000000000d6acabff06fe9a6ccf02f780f33902672fae0f038d8e19ee234ce28a0b6a01410100000000000000780e4353aca40b0f2b2403c862cb33032d49a820244bdc2853ce158d48c4f610010000000000000020778d1b86af98ab30d7adea5f3a4f215d6d4a9fdc892d8999275b2c311fb05f0100000000000000b48cf50a4f94e83450a791d6de965c3e8127c1c915208f2b85df4c3a84b2042f0100000000000000ba12ca0e39666950f91cccac64a409fc9216e0e6e7466d26cbcf7925c3d0fe120100000000000000c60a9f5f89ea3a56499bcd39bac7e038c25f5b7720d873fdc12b68d2531eb650010000000000000040b77fd8fcabe868dc7f2a08bf14c67e4d433886c3cd3738d1b0b9c649bafc230100000000000000cef0feb2602582b96fec882181d34bd5504645c544c983b1a962188239eed90a0100000000000000b633c47d126eceb0e36d788370ebaa179b0c7a3a21cf5f1421bfac40c895ed3c010000000000000092ee092cd2215c7c1628086c08be10a3cb969f6b276f600422f3526f303bd878010000000000000086cca25ca588d995ba36f447a87ee00073a24190e8335247875e1bb25823f845010000000000000022333a4409728530184f55b95171d2ddcec037603382fc7d6443b1f7b96c813601000000000000009acfd215519f40156749868afc8d56e015759f71cf183fe68382e8c02c75b2510100000000000000f44b3ec5c7b2188f208d60d159d1f5b0914a51a0632eacea6b88ec7b26d6673d01000000000000005ce79c3ad8a0e1806e863f0858c28a81408d19870a62ac0316b3e6345cbb5f7601000000000000001cbfaf2b91ee79c6288ad01dd5787070b34d5e1b8253a1765904eaa7d0b93f020100000000000000b672ee2f0f9183585ac4875368a0defda6d3c81927fbfc34bbacc7481058cb4b010000000000000036a547b4aca95274437f3876bec0447f775eacd01b09d95869390d326a596d450100000000000000608b753074d6a1fd8e099224a7495f61e3db2cb91e1e88553113057a5f49533301000000000000009ad5ff7033b5708f5de5496a94c16fefa6de45ad641910b81d6699c37888435801000000000000003ed1ddb7a3c787fb4b4ec4b71c6d8b8227ec5b2b74206be0df38c9e85af482040100000000000000a065f45a353f24ba187248aacd9c64d5c3a92ddf92b4a5c33994f56a07cea8400100000000000000407e78f505ae833a2eaea113245bf6a5ef6abd0db66141f770cd6cd7a7e75d7101000000000000001cdcbae0de1e2be6288b7bdb0837bdba849f0c93e86b21d8f8f7d425d933193001000000000000000c73fd83ff0d798ecd6be0518e340dd60c45bdd386c95236ad1db6b1572f1c7d01000000000000004678cfe8b5ab7811861b19336b572f9c7175ad92efbd8a031e5fcdda58173f51010000000000000078c91c4ee02089ea86612f66d6022a0cbd54afe470a162a72036611623924f6d010000000000000092d42adbe88eb57759aac9f72ef4a88c3459635bf9886f4613371efd4e7fd14a0100000000000000e682cc2e71eeebb447a353fdf541b2ce7f9920ea1ad2d832bc35e3b49169bb6901000000000000008ec5856a5fd17617c0af76efea16a87d0c5e769eaad39e91c40dac93fb067d5d0100000000000000b2967e3480b89af39e38367f948fb287568f27bfdac4b65fbc9d97536c79c7000100000000000000f60b5e74957220ed7664befb71e9621436e40f2b6c1bdb1c90a6de9c3540a84001000000000000002a98fbaf7ec22832522e3f96821711ef684283911a524960efb14953255baa2b01000000000000009e5b6a03be0ed1cb27d61340f02efd1a285cf73519dead55195f001ffa274d410100000000000000d0389974c754c672124ce98f5d49f4582fc60aae5fec560b5c332a07d835412d01000000000000004ed5f55ec45727a57e2d8d6914f6d2acffb17b9515d347ba045067502a0b140201000000000000004cb98af1a70e917453f5dea682917e7b3077ea9d41dda7764433258a9d5db54b01000000000000002a0fda136ae348db338b87bed349145a94ce091227774b0542e533a83d1ba455010000000000000036c5a061b47768957b2b939b2e37e4cdf8825a4abf963c4f912f3ba4cd567f1e010000000000000026fa6b3ccef89437308d6c893173c45de62e3c2cca8b6a67ad951ef8127792240100000000000000a6cfacf0aff2d5c6e8eadf71f397a64f2863e5f0b8793e3068aebd5b3030e13101000000000000006a5607bc375d7ac0908e7643ea2e89dbe42f4f805c2fb6e2a22d0385c1232b310100000000000000f4ccdf83d734edcc568462572abaf32d22ac7faf8000195e02273d1c9665430801000000000000007eb2b0b6adbe5a5bad38f46db207f94c896d419661f4ab8f21e302a543df9b11010000000000000048ce0aba6f1554e139568b4d2358d6cca9bc291d3600787cc3e732291002ca2201000000000000007a07e4b6b4daf45f4af2a98e7458034447ae0e67e9a22596848e58d4ba73b9530100000000000000469d81e8b43725a64da6b1ce10eb53eebe1aaebb9703f75ed452e12f45d262730100000000000000c4c5fe47a568c2fe4876eafd5e0093dcc31b450eb87bfe58397dfae2a590d4650100000000000000fa5a4da949ce29dd0fc20fe56c40d63ffded8e2dd88844f725efda0814ed526401000000000000001cc40fa83cd0a4431aa63315b55c669370a4037756089f3402a9021e2d80666401000000000000003ce775a4a6215dbfbdc2b0a8a8b71936abd61642b5fd1a0c1d06ba548ad3025e01000000000000001e9c3192d1c2e7e1d5aa731c1bd3ffac1b55bfff1cc1beb0745a6b54b4b32b180100000000000000fca464b97dee2e318ad8d4516fd606a5401f5d15467110112a3326ef96ce00760100000000000000bc3bf978ea283cf493b43928b605309be31def9d4a1daf47788017ac61c7c81b0100000000000000cebdabff22e607a75aa8db1bf875511a563200cce3f089972aca719649b6e1760100000000000000382fb32d7c8868ce3765e9ccfb462c04071a3d70cab3382c796a9115ab0c310301000000000000008a6dbf87f769167b4eb982f63b946f96a1f223b6a6f2789183fec09581b8e906010000000000000056927fdc8bff2063e108fe1b05bbde2f6219bda7d8663fafcf3d2976c72153590100000000000000b027ae418b6c79d9f3a2b05df499d3aaecfb327e6b9d7995a022dc5265ed76180100000000000000eed7e8e8a64dfa89c548a31c1b9fec7af5aef4dbbdb26997b2ddca72d4f8790c0100000000000000fa49d3457520dd98ca1489b78354d7d30a9bdf2181140072ebda1c3dc3371e450100000000000000a811cc491bb3487d5e604dcf6dca3bf529437162f3b8cfb8514ffab16809ff600100000000000000fe2848018ac215f72f551e58dd2d065d99b788b5a7aa59b9f9fe47a5bdbc046d0100000000000000b6ed5b0c17ca7560c71f1778694741009d3da979309617f0bb992084019e2529010000000000000078cf1debe3fc0da2ed2473d1e1835a478cc3e7008e0cf42043f287bc36804b710100000000000000f853a1534a3af56217661420536dd7bea0db6f6db843d8fead77c308ed7dcc7c010000000000000032e2c97e308c84afea4b37d7dd8f62e67763126c357c9e6e49b27f54c3702b73010000000000000050d2e3ed042861cfddfecfb31d47caa1927064cb0372213a3015b2acdf1dd1450100000000000000343a9649237a3b9ed165df5a8b6655996a9920091530b4896b0edfa3afefa60e0100000000000000ca9919b307ac6204475ff029334863d464042fdb84da988119b6392d5862cc78010000000000000002e12aee8fa547e191b4395503c28d4b14650c1dc03c698d73f4cd30f03de90201000000000000004050f1025e1481eedf4d787eb4232123b271e5196dcd8670d754836297d0da7201000000000000009c5d3bb1387f53f0306bf7f24e81dafa5bf972048de867e2e517938c4ebdf7120100000000000000560c91919fc22867159ed77bee1b3e70d2e222a5fe6e830fceb13b58b0daa5290100000000000000e03e94cd4419d9cb8709ad2859e598912c78c01b15eed53ec0c336d8d6c49142010000000000000056606b6532cdbf27358fd067d61c2a65e4b3e8934c266a857320ff18e5c7654c01000000000000004ca838afa9f12e88436eacb5024f3f94c95a66c32e114f65f3136176e426c75501000000000000000c60356c02d5d99293952c478fd07b2cff982dbad863ebdadf25c9e69206f14901000000000000003a8b589c8222ede45b3d95c8d9176543ffa9a29cbfa0ba2af60fc412e732d75e0100000000000000105cd6ed1f55fde42f7c82d0667316a4f1e26e9e53d96f540e5aff8905897b5c01000000000000000884c85734b971a88cd94d86d3c62fdf163256a0387e15e2d36d8f25523a7748010000000000000094d89cb8df2b03c76d41a6521e5803d6f98e204e1839b9ea747dc7e253d35b7f0100000000000000f2cd13ba1efd67dfd5f8c9150b1a74d1ed1bad1a72c36fed96163b062e463d0101000000000000005258f48e31bc89f5d53ea6a12eea9698f8e72c6068ac1588100d8632bc674d1e0100000000000000ecf0297bddebd3d766ea7def2bac79ad6eb650fabdcd029b99cb1649ff7dc8150100000000000000121f9d8ba85d89e3c6f9a0fedcdfc9b05cc40a6d3324eff6e8a58aec5f52590501000000000000008a16fb5a6718a714296cb8fa2ca708f677f78c7f883ba3c5ad1bbb9e23f37705010000000000000038c9a0897d9caff03a308d2120bbe892974ae8cb05f1cfe8b97259f0ac2e852901000000000000003491cc113ef8fe1165bb10e65cbb461955f92f8f0d82f2dcfe6664430dab853601000000000000004e466f6a4930d856a1f53f21c1a44451ead20c8c71319f6a685f0e254d24c32101000000000000007617b69110c43683b5000788259be855890c474be8fed65d7b1dae1d534ef85c01000000000000002037d70f4c244c81422409ad01d28d72a30d26e595fbcc791daeb57f78a8567001000000000000003cfa50228b841c7d2fab03db7e4bf282cf14e127ab9b31c23fca1a79be54e823010000000000000088fa8bb07ebce99964718c65d0d6f1b091ef2f4d4cdf7b94a22c42c007ecd706010000000000000052ac28ba2601723d23a086b5d775f19319f110ba5e9292f2af461e71903b5b50010000000000000002a4b2935b657f9ec563642ab0f34e223ef594cc70c856b9bd70fbe08372156001000000000000001e2543674c697ffa09657ce9f9c4b610e46da5d73124410b327e6ba5d432263c010000000000000092e5bb9d0906f768dbdde0696b78e493cc78dc1f68789575b24f0b962799b51e01000000000000001ab9d2c814ed7a719ef2aa94dcf4db8aaa0315a59d4b5699e86656a6ee9ac56101000000000000004a512ac212da2c96d7bc8590865ce627e6b60246700595bb100b240e80a3f0760100000000000000b63f9ab3a147d76614bfb688751f79fb9a120d40af7ba3bb123c1957b91a411d010000000000000010e37a12fc6ed768d1a2d33c8abc6db675381dfe69c832abb77d9ba2341b3c4a0100000000000000fa1b0afc9ce9e9742c4825890f6d93bb87bd199e55e86ce66ba7c34ce43e273e0100000000000000f6f94569aba4acba85b7745a91caaac8a89c95469cf2b9813891eeb94327937b010000000000000042c56bdb09d52942b0fedb07045113a641e2fd64a428b1fa608b5adff9ff4d640100000000000000fab301ce05079af0f67a042f807cb17a770c0e1a2ceb3d956d569b44625df87d010000000000000086ccdecaccbf1a58049c55793916611cb8749edf93085bb764e77636357ec172010000000000000012af78070e965616e16ab8cdceb871c02e09b180e3f0a69083419196c9ec665d0100000000000000f29cb4064a1cc3a79da2c9a9f336053cc69d50bcc737257ca2f071c37030510a0100000000000000aa74176b5870c97b754a157ec0d8032148c2ae717a905e0e5e626048b6f5334301000000000000003e07b075219fc7ace8dc3bf3a06f5dc12aa9c7e45fe30244d2284bcfb1e6ee190100000000000000a4a0bc81aaad1ebce3fdf896a8d6d081ab93efc2de9d5c56f2632edfeaa7ad0f0100000000000000465242c8915eea46e25549f2ab97cfe78784f25083e51773e07d5a0cafc2de32010000000000000022376791bf19fefac611324d27bc6acb4b7f7eec713c186adbeda5a1e1b88f340100000000000000bc8f93a45201992fa9d04355095d03adeb5ff1aea206425eae4f902ffd47fe200100000000000000288c08430a7e427400dd5b61926b74a82abcbbc91ac739190cc791a581f6836a010000000000000034caa67978c1a5280b5f58196edcdb5c864b02d0fd40af9c6e6b9716f3fb12680100000000000000fecb15325d9baf603112dd397d2e83d3694414f529d75c4b639c7e775b979b14010000000000000028052d0b965ed862b7861aa7f3f91fe52ff8b0f795ff476c7e0a7aa42e79933001000000000000001c860d36fc84a54978d99ad400a719dbbef493f8631856e6def3e9ec998cde3e010000000000000036ff2156d388346076b08a5c89aa760b714eb1bd293e2f3e4c4f35049cca9372010000000000000092cca18f264bdcfc19e5c01515ea9d61a0bf0b4e46b2bcae372a428b9dc35e390100000000000000e0b770b1bcf7deb030ee75d5bad6ec1ebfe06ded0fc406a8520a9650fe832330010000000000000066a5a598bd5d484fe66e630a3e57f3b245fe0413f81401d7a5d59aeed1a3a46301000000000000003622bfbaf9350b5906bdf9ce362e06726224ed141c5d29e8e175e0beedbd3d3d0100000000000000526fdfd1d78345a1b2843d392122962cf89a4f157af2a3d0c99607f506175115010000000000000008e80cc5ada5e557a1cea3658402bc83f9892b5c4e112b6e157e6e7d3663c47b0100000000000000a6730d04d45ee4e7e25d3f7b80b4e2ac12a6644a4128127fbe97e97a1d690d6901000000000000006ed90090a744a0d55adf8f8af5af4d5198bb67220ce33fe71121d7c51f27a4130100000000000000b6ad9df8c32a78e9481e75f484fd0b740554276c026736f0dbac0987db0885670100000000000000ea82745d9978e47fc6bb25fc01383aad42aeee65662b6af304474f0e4101b06f01000000000000000a6a0f8136fafe5c2e096704e37d12b47a1e46151489a23eb1713b37769fdf780100000000000000f25d3265659fca9d24ca877823644f1223714b0167d0a676cf3c9c447173d12f01000000000000009ab493c4c8007f49a3e7d1e9f1aef39b39cd66a496e90486e62664725c6ba06f0100000000000000e0f7debc0989ef62dee42d2cfc81a07625f89e511c3baeed9e6952e66d9b6a460100000000000000ec19137bec15ab7c3cd7625e029b026746f6a90d28bf28cfd61457c40a8f26660100000000000000cc60431feaf7f1bf42d805f0c12a1978ca9b3ec0a21397a71ecfc2bb7d52d20a010000000000000066f55d4bd0b47f3cdad20c74b98e204e51bd12799df198045a1d670e3661732b01000000000000001827754b7465edb9bf4ce981bdd3a33057f9450fc895e39654dbd51c3ab9835a0100000000000000d0106f6fb9b008052da3223c389525681d9b6e4fdb73a4078f7f1949bfaa3502010000000000000092006149452119964a75232851f01361608dc0a52031f240e93e70e98a3ff21901000000000000009ad36892ec05281de9c63c7cefb3f31e448957a9572e650d9f3af1f21b2f515e01000000000000009e3b3214afe654cf851be9e564e72f834168ff65ce346ac54024cdcd9325712101000000000000005e7f927ca4edf203d65f682fae546d8d43913b253dad434800df66be1f07685201000000000000008ac742d2a3a14cefdfc819c03f5d439eb8325b7f0eeec0a9d4025784ba7e057b010000000000000098f7988d5a74a0e52f58dd3d232ac3e93ff757480db9d4c12761b04fef032c460100000000000000248cddedee20dbb65f20a1715c2490c09241f6800b72d0c4029a1c234f2ce74b01000000000000008ca0a873b2685dde8c4792832cabe50ea5a1f8a9a661a336689859319b66ba6201000000000000001cf3abc7c9d8027488ea2f5f2463fd091b194fbeeebf560875e8648fbc67dc240100000000000000ca526faf8ee5263d4006452735885dce304cf724040fce84399254d9160d6f350100000000000000d27da69172c428ddb80272e6fc6ec90985ee281b45f933e5bad65184bc3b5d0201000000000000002ab0b5cc358184be4fa29e7a3dc24806a72e55baad40ec9a117324a884242c2801000000000000005afe620da258a48f00c3afbb8a98161e977f076c7e7f8392975a4f0db4b57d6101000000000000000c3292b5065b7b78a2de5f4fe397fff21df37c0ff7eef94c5fc4397f760e6e4601000000000000009afa4df63a9a72e8dd0710638b6b6a10e37fbe2ca640f828c0f943e5ea38395501000000000000009a62ccaeef1677fa3fde2e172bcea58f695a34304ccf5594b74fc7a7ce9fdd0001000000000000004616ac86f0d45899eed3f1246dc5744858a694a92b0abd9f10e52dfc9c28674601000000000000009281394b5d35827c826e1d7444f346c247b9a004aa0292a9ca2b16e0fb5568770100000000000000683ce8ca29f09be942c929571aaa188b89625f28569721b41eb48329dc1b4b0a01000000000000007e88cd54f47c1f4ddd9d3a198fc689d24a523fe186d526b14e476f14ced7db3c010000000000000058efa50da673a8c3b5799e278ae7d32f9eee340947f793f44348ba17e25a885f0100000000000000b842693f8e988a596491b840510f98489ae286129b41fa51b8331ca3b82da7590100000000000000e6a08fa6af54d2308215f4a62d554dd5b82deaec8ba22a2e6ebade7202ab9e2101000000000000003289fb8751519a2f8d56df55e5491439852a63aa916d9d779cbf574df9a5d86e0100000000000000b85b1b7b8ed510a5bc1d0979fdc04ec7b73d84c7d1d767dafb6faccc8dfd402c010000000000000038ab6c4b18e1c86176cf53301ea990f1cdddcdc3f2c3e0f8dde126fa59f60b2f0100000000000000386bcf52f4c464e6a18169f776d69e90880301f01fcc8cc0ba451f1d7e6c3b7c0100000000000000b41546275611fa185c88c7016e909222b3a757b476316766a72729d074d8e92b0100000000000000a8d082a4289fe5ccaada604e70c4b1473d6fae4374663672e61474852c1ebf2a0100000000000000723f8c9d81d0874cd4130cb58587c90ef454174e9d6d9dec11279a553caf00430100000000000000309ab613bea03c4431f7602c937f5a4d17e2102db6fc7f77e32f7a245041b90c0100000000000000e0ee8ff76b364ad2ccc3e82e69cd700c0895607a449c5af3745bb3018a1843220100000000000000840c71fc86d7df66080508495f2c2ef97ae503dbd75362c96a6dcfd2cb30b4450100000000000000040000000000000002651bd04476837746eaf45e4269c11d1ae31c02468cf50d968b347db96ec3b198f8b82b01011e20000000000000d3f7f910000000006009000000000000a50432904ec260963195582a1d339f9fbd2d5d76f551160105c922423cad0d94482f010000000000000076441c448aefcf40a72128edc9b44a4f7ef9c267c503e98f5f9c72d5e9e92f000100000000000000526e055ade4ac425e9b5f93ce4394601335d3599a5b742603126d78ce99a4a54010000000000000072ab87b654d80294c876cbefb534b3344c2f64159b015b89221331ec214541750100000000000000643fa48931f2331b61ce9664acef49522251d1e671490d50d48aebdab81c2b3101000000000000008008c1b7061a2402634fc15d3849e2913863beb9f55024bc8cc7fa7d6e397817010000000000000024a51a9bdb67213626d1b52bd8dbc0e9b94ea88ea417aa17b56212d1cea3e1780100000000000000488d520146f681678e9d229f5e29354edf65e521246b28a4175c0502e060b9200100000000000000503cafb91c14eaa2931c4507090b27170b90a2a76d3cd4669f922202c781fc350100000000000000c681c1acaa82eddba6e394ddc9a2fd1af34418448d544c34966a31c837667f28010000000000000020352ba0565811731625a8001d26f5d899e5856dedd0f9c6bc3bec2995704e5b01000000000000009cb389c209afbebda2b12113e0266b3d30f46e2a91aaf4451c193d640288357101000000000000004c9886e2e62ee92a6778d6a7928052732044b64fa61969cd8e37f3f7e3406f720100000000000000c056f1879c1fd443e38244c26ef138218b3e43e70b1cb84bd7242e354cc9ee0e010000000000000028cbfe245b9eec3bf55d8d249ab3680490644aa23a7b688e00478e7fcb0fe02901000000000000003ed19f8df1a2d2c1176df07baff4206c94f4d752de6a46c5f3f34264a88b0a0701000000000000005237e4509f24bc9e8bf9bfd78b594219d86853ae16601f692f10c9b16b88f83b0100000000000000e07afc6e4b429df62183d1e1c417703cf8467e0f1bc61f7e33954d8336c7a935010000000000000098192016f83ef2fe74dba1ecc6526efc61b79f3177c00dc7c053160391858f700100000000000000f6dddaaaa53b57763610037753656b591d90fa81efbadcabbeddf7378c23602701000000000000003e69835397599a4bf081775f9f42f0f4ee686d67c9af8eacc4a733fdcdb0290b0100000000000000f8a681118ea0bb9dfde2813ce5144eeb5cee881c27883de1c0c759255ec32654010000000000000000b84e6e296de1009aeca95ee09bc5173aec6e91b1145b247d69e477588789720100000000000000e67c524e443cda4cd27dfcce70488a5d23a93c8c46a5e83ef5a69eff3a02fa5a010000000000000024a57db63b380456d56d561d8a9da6db13d298045c9672bc4086a2e0a567d55c01000000000000006c50859d9dde209012eb3868c1a3a6e80ae8fa528ace9df68e92dbbae60368200100000000000000a8e470f2339e3ed0da456780dd9207e9c6a02459238ec3057a6ade01fd6cd60a01000000000000007c5f58a83f8101943c089dba3ab906c07811e853444aa58dbcc986c4095fbe7c01000000000000005494142902284943201b7cf610306e8665eeeec87c014d607175c3f50f76103b010000000000000072ed7192625403acef94aa9189f9f179deb89e60478816ca96c79b742f757e750100000000000000b4ffe3c5959ff37c11c6f19d91926cb97aa4bf0f604919e1753bb55664d061680100000000000000bc4c9b5425f9a2aa09e3239332c702dedbfffa2b9f4cc1b978b307fc1fa1337c0100000000000000e07d5b19d98a6f8ef5c964b507fcd88f500a2a0a9afd5cffe9d4e3f74d83b27f01000000000000004e2753547f6ec0a896bcbc55b9eeab875e8019acdeb10b979210af63f24c4b74010000000000000042e7851b82d8b7722b9eeb5eead57b21bf533fd25acb10542a52889376fc3920010000000000000028ce9c093ac772f56acb8dfe8b33a3966d4b8699bd41814117352d397195bd5f010000000000000042ad4ba7e8a60af1abcee04fdd82ad02b24f1e2535bdb1abcdde886efbf0fc4301000000000000006ec27dfa7ac9d35eb002c55d3e4d56b4df928dd5c44323ac228305741c9e09360100000000000000b89cbc83a386d6f5d4fed93289ee50fdf69d77369ca0c9a8b962554e3fc0d37e0100000000000000e61da4eefdd14434952c58dd1943f7f63185d03321ccc8835e4216badd16fc190100000000000000722d7d57085c250af633f2d461874d59aebc8021eb1112ec8805db5ddea53e5a0100000000000000a20797f3a8669a909adb22a3aee2844dba82d231cc33f5d9be0e2c533cb82a6701000000000000006a1274b6748bf822ba80c9a9416abd3cf591b7aee6adabb8359b7dbed8ebb3770100000000000000dc1274e0689c7a3eac31b41ce352719529e65c01f26999f74ce17c9905fce87401000000000000009c9bc1074cf465c0dd39f74bfdf16a67f81339ba2ad117a0c7030b4f067877170100000000000000d8b38c77823eb1912bf8b743cca6c655ea1844ee468fbd78b394bf222bf8bc2001000000000000009a6223b8a7aac3a28f958d9f6c6abf55f87a38cd22fa563d6327a4d86da7b64d01000000000000006ca924ff8f8e69b8ea54dc988c67fbfc1d955f357f01e5ff4b8362ad7d756c3701000000000000009e280c8deea88069fe5118eefbb994d01373ff5dc213a65d06e6873b528f6c2f01000000000000002834c706b030a82a81ec43e2faf26a7d00392e1d8f2de8b7a876183ab612cb180100000000000000d0189a530b4048501596c4530054fe89f017360402da0ac197a8100ac693b06e010000000000000006ced0dafbe316bc507cfa57f506a58ad57ba7a69a8291ef87e8f0f5dceff6040100000000000000364360b4881f0f2831a226a422c79348776d43a2365dd636dea05a09381f8c2e01000000000000009092f9e937617716876caae2eee008bd44b0d0ed3f3af47073dcab55fcb1d5740100000000000000a86c7bdf11794e554439b09f9f294c8e0abaebf447c7bc54419434b8b95f864901000000000000009e9f565a8cb6e8f2154a9833735930a04003505856c3743a0f71afe64c7acf710100000000000000b6397b9e34e46715868bbaa83cb67dec4d78ce992f4a9c973e6fc1e2dde3d76b010000000000000028a027ca1c0bdeebfc8fce85ac4bac48cc072523d9c4a86b4f2594f9142e7e3b010000000000000042e4c41a899dfb238649e5b17dc232c2699353635d60e6a3bdcd71f9b82cda300100000000000000ce4bfd8c5611b1637066ef9e579c85efadfc9513b882184e00b75871ef7f5a2d01000000000000005c0419f37036f2bf999f3958b49f63ab19d6dc19847a393dfd26cf303fc8d911010000000000000028558e46037c51ece4d39a8a4d34688662e629413c221d6226afe454240e70210100000000000000e8308668e9f16683cc739791a6dd530b819f45e4ade2113ee2f27eed1c51d1200100000000000000e41b3ecad757b0a5ecbc6b29691681df25b3d2b5f1ea325b648e607a5d76cf080100000000000000be03fe6bc03a7884524047567a8ccf43b3c988bf3b447ca9e1520d1c1f83c53901000000000000005461977495f9c407a8d951e860a1cb2087592103229bdbd879629cc538a4182b010000000000000026d421de2e7251020ac2f8b8c7e348aa904dcaf0b6d5d73fa0113b476f7dd9030100000000000000bc56c07cea21bcbbe058aedd2ced9fb4757caead55f96bda9bed1c9669c32b64010000000000000078e1a4fecbaac940c04e0b591a01ea66a574b5098852ded2810e3a534971111f01000000000000006ccf2ce8e149999a7bb996faa65194e60aeb7bcd1937c787f886fe979fb49e6601000000000000004e5b37f3ecd0fb3131aba488083c145d60b924ef98b286a0066e0ded309e886b01000000000000001e866bed92016cd2dcabe2d87fcaf8c1d7248255cafb9e10638fc3a2b476221b0100000000000000946071eab9c0fa1de9be2ad3c18041f1326faab41d84d9daf9f89c0daf9c0f00010000000000000082b820c5bee8ee77e35203dab387f3434b8502e5f1c35dfb2ad15b5c89d47b3c01000000000000001cf3446b4b5116a1784d92cdc5101e55a5fb91ed3d93efccd06b304a94362d0a0100000000000000c6d5dc6e1ec83491397390449d8cddaa88631e8855efe50697788a93de00fb5501000000000000003a4b0919068523aa04ab29f1b49bdc03a176a4b93f9b5a7e6e0cdcc8318691030100000000000000b288a9832e07bef83c5a8ca72c5a5583b321672ba7c6cdd44a971f855d32d95c0100000000000000d04077347325618eb5cef03729a157b910fac54ec7e344e65b6945fb9fbbeb3b0100000000000000fe3b55d17e25c44a3568885d9d37276df81fa5225d9d73ee67321c7826581b5a0100000000000000faa52c51af82fe8fcdde5ffa213721a8395acf22e30bbd2aa420626571e6183d010000000000000040a2527ffa7d30d788eca127d435c8b5aa48972cda538b9a1627a57e85c8fa190100000000000000844b691aa95ff9a15b50f5e5f4f0e582db6621326cf18d7533f55bc27549497a01000000000000009c1863aefa0b4d5f3d48275769ad0ed04e1428db9694d83b9bb8b5d833f1b41101000000000000007c4b93d862704aad434ab3dc2cbef824df738c5dbe1ba7b34daa38b2aabf7c36010000000000000028e972febaf463f22d1108053e7c26ccde1e6018d7c302985bc227557e0a663b0100000000000000261ac3229b4bb7a376c37f17e287b2eb596d3b478370b722b6b41443d8708132010000000000000080413d2894759b53a03874bf96ffcb66117e4a08ad7f159c008f2b3b6cfcbb470100000000000000ea885fca10a9473631bcca2549cb8183beef534a7ee2bd59a0a6f74d97bcfc4401000000000000001a36d936f4692ac8387ac0ca1f051970ae480271e39fc134436b86b8ec83b25d010000000000000026d7422872cbf4d4918046f240a13a37219a272f4326b3f3bd1249829bbcd12b0100000000000000be6106f9217a1847af66de9510fdfb40514409556506ddc1c1a897818434125b0100000000000000e03dd3bbb140ffa44e0cc0e1846967b03aecccac78f6e2e0a1fd3ac0d34f554a0100000000000000ae2e94f092fbcfe263519f950b5ade09c474258a4e0d5e62570d02b3f71d85480100000000000000bca6409d6d7e4f94ce797594db4363bb8bebd5387770aee0bb7663b36354fe2a010000000000000088b8e0da91c48fd9bf94ca5ed7fb74797a037e626c98ac18cd76360ccd6ac11c010000000000000086c1922e4ed392d72e0fbc0ee28e7ec0a8ba2b33470330a606cec9a159a796260100000000000000344589372873125fd660e2ff3ad9bf67230f9306acccaea070aed322a8ede264010000000000000036465f4be77147914969ea78f8e39610310679011dfbb6137dab12e18a687a52010000000000000098cd0a4eae6f560a9e760f8b806b36861b805798b4ee0ada29f6841855d51d030100000000000000584bf60b8b17ddaf70f87f371bd2b425a3637e05c1b75469f45ea85717063b6901000000000000004c5e6997b6f186855b1f4c9f8ab2d6cea3da2e86445605ab89e5b5821e05bd3d0100000000000000f85f12f4fb92075bc59a1711f35e8f3c8313ff08028d2af80a79b3682a3785590100000000000000f8db92b1e5f6e9a7f23435a2aadab56d5ab7746c978965d924de2f89ef063c21010000000000000004ba7eb24012b133b20a8021b603a1483c4a5b9ad3415a4d7ca2b1ad625719550100000000000000202e3405e49bb882f1d49efc4a4adc5b62dcc96ec18346a48aad5a510c189b5001000000000000005c39533cbb607f1f52d82356d267a56399045e0d7b7e95887cfd8ec13173db2e0100000000000000b045bf0235bbe708e4d6918758650c9c7f9ab4d638e4a841807ed7c82ff7f63a0100000000000000ea6acde5149e930af7bc3b17b7f0bdcf12dfd3dc3437f774f823bbeef420a97201000000000000006e7a78e9fdfe275f3e000382ba30452729970578258839db6c0fc568e20b35150100000000000000800dd25a7aea3fd7359065185cb35b4a2fad0b81b3d58de638e6764dc8a8211d01000000000000004e1b48e67c1e62e46add39fa523b956946228ea0f08bd9d20ced798cfc9a0f5b0100000000000000faa6ae896c2d1040e495acbdcd8d90a02ccb17ba6e507efa2f7deacb3b28466e0100000000000000840290d318350bff32db3dcf6138b822cb2adf1dedf5bad8729471988955915c0100000000000000907ff7ac1e6c451d236c05c8d3f85640d9f9472d6a30115fc26135dae020e638010000000000000014e2f25dd3376eb7978d413c14322704a2ff3d9c0c2971acdcdf9720c2c13d6b010000000000000014cf97e739cfd033c2828f25ad3f15e8f6ef62ba97dd74164e77e61eb85454260100000000000000a07f151db53097c2da9dac4b2e0f194931a677a3ba99df0f3976e34409fd64760100000000000000d8faee17dcc461acb22ca1720b86385414ea8810ba31509fbd8da8733029eb1901000000000000004cc9ff5edb36e361b088b0eff52fc6e6559c1169ff87ccdb62503bceab7c74450100000000000000f820a8ed2c97f639fea2892d0a89ae98ffc4c0054f948f9a0108e4d99f89994c0100000000000000fcd5f4c4fe11f20ad99dc8345b7dc5600caba5d5b7d3f499c3253c095152d45401000000000000005eac8ac37c95fc11921839550a30ef071bbc80fb10ea1482cc67818e184d544a0100000000000000ea2b17bd1b69a7b442dd000db0f12f0bd4bf7a87a540427986bd32f3d3bd55580100000000000000142445d894c1236a38c6b1bcd9f5a7245897026424ce9544002008a7702c3b1d0100000000000000d6acabff06fe9a6ccf02f780f33902672fae0f038d8e19ee234ce28a0b6a01410100000000000000780e4353aca40b0f2b2403c862cb33032d49a820244bdc2853ce158d48c4f610010000000000000020778d1b86af98ab30d7adea5f3a4f215d6d4a9fdc892d8999275b2c311fb05f0100000000000000b48cf50a4f94e83450a791d6de965c3e8127c1c915208f2b85df4c3a84b2042f0100000000000000ba12ca0e39666950f91cccac64a409fc9216e0e6e7466d26cbcf7925c3d0fe120100000000000000c60a9f5f89ea3a56499bcd39bac7e038c25f5b7720d873fdc12b68d2531eb650010000000000000040b77fd8fcabe868dc7f2a08bf14c67e4d433886c3cd3738d1b0b9c649bafc230100000000000000cef0feb2602582b96fec882181d34bd5504645c544c983b1a962188239eed90a0100000000000000b633c47d126eceb0e36d788370ebaa179b0c7a3a21cf5f1421bfac40c895ed3c010000000000000092ee092cd2215c7c1628086c08be10a3cb969f6b276f600422f3526f303bd878010000000000000086cca25ca588d995ba36f447a87ee00073a24190e8335247875e1bb25823f845010000000000000022333a4409728530184f55b95171d2ddcec037603382fc7d6443b1f7b96c813601000000000000009acfd215519f40156749868afc8d56e015759f71cf183fe68382e8c02c75b2510100000000000000f44b3ec5c7b2188f208d60d159d1f5b0914a51a0632eacea6b88ec7b26d6673d01000000000000005ce79c3ad8a0e1806e863f0858c28a81408d19870a62ac0316b3e6345cbb5f7601000000000000001cbfaf2b91ee79c6288ad01dd5787070b34d5e1b8253a1765904eaa7d0b93f020100000000000000b672ee2f0f9183585ac4875368a0defda6d3c81927fbfc34bbacc7481058cb4b010000000000000036a547b4aca95274437f3876bec0447f775eacd01b09d95869390d326a596d450100000000000000608b753074d6a1fd8e099224a7495f61e3db2cb91e1e88553113057a5f49533301000000000000009ad5ff7033b5708f5de5496a94c16fefa6de45ad641910b81d6699c37888435801000000000000003ed1ddb7a3c787fb4b4ec4b71c6d8b8227ec5b2b74206be0df38c9e85af482040100000000000000a065f45a353f24ba187248aacd9c64d5c3a92ddf92b4a5c33994f56a07cea8400100000000000000407e78f505ae833a2eaea113245bf6a5ef6abd0db66141f770cd6cd7a7e75d7101000000000000001cdcbae0de1e2be6288b7bdb0837bdba849f0c93e86b21d8f8f7d425d933193001000000000000000c73fd83ff0d798ecd6be0518e340dd60c45bdd386c95236ad1db6b1572f1c7d01000000000000004678cfe8b5ab7811861b19336b572f9c7175ad92efbd8a031e5fcdda58173f51010000000000000078c91c4ee02089ea86612f66d6022a0cbd54afe470a162a72036611623924f6d010000000000000092d42adbe88eb57759aac9f72ef4a88c3459635bf9886f4613371efd4e7fd14a0100000000000000e682cc2e71eeebb447a353fdf541b2ce7f9920ea1ad2d832bc35e3b49169bb6901000000000000008ec5856a5fd17617c0af76efea16a87d0c5e769eaad39e91c40dac93fb067d5d0100000000000000b2967e3480b89af39e38367f948fb287568f27bfdac4b65fbc9d97536c79c7000100000000000000f60b5e74957220ed7664befb71e9621436e40f2b6c1bdb1c90a6de9c3540a84001000000000000002a98fbaf7ec22832522e3f96821711ef684283911a524960efb14953255baa2b01000000000000009e5b6a03be0ed1cb27d61340f02efd1a285cf73519dead55195f001ffa274d410100000000000000d0389974c754c672124ce98f5d49f4582fc60aae5fec560b5c332a07d835412d01000000000000004ed5f55ec45727a57e2d8d6914f6d2acffb17b9515d347ba045067502a0b140201000000000000004cb98af1a70e917453f5dea682917e7b3077ea9d41dda7764433258a9d5db54b01000000000000002a0fda136ae348db338b87bed349145a94ce091227774b0542e533a83d1ba455010000000000000036c5a061b47768957b2b939b2e37e4cdf8825a4abf963c4f912f3ba4cd567f1e010000000000000026fa6b3ccef89437308d6c893173c45de62e3c2cca8b6a67ad951ef8127792240100000000000000a6cfacf0aff2d5c6e8eadf71f397a64f2863e5f0b8793e3068aebd5b3030e13101000000000000006a5607bc375d7ac0908e7643ea2e89dbe42f4f805c2fb6e2a22d0385c1232b310100000000000000f4ccdf83d734edcc568462572abaf32d22ac7faf8000195e02273d1c9665430801000000000000007eb2b0b6adbe5a5bad38f46db207f94c896d419661f4ab8f21e302a543df9b11010000000000000048ce0aba6f1554e139568b4d2358d6cca9bc291d3600787cc3e732291002ca2201000000000000007a07e4b6b4daf45f4af2a98e7458034447ae0e67e9a22596848e58d4ba73b9530100000000000000469d81e8b43725a64da6b1ce10eb53eebe1aaebb9703f75ed452e12f45d262730100000000000000c4c5fe47a568c2fe4876eafd5e0093dcc31b450eb87bfe58397dfae2a590d4650100000000000000fa5a4da949ce29dd0fc20fe56c40d63ffded8e2dd88844f725efda0814ed526401000000000000001cc40fa83cd0a4431aa63315b55c669370a4037756089f3402a9021e2d80666401000000000000003ce775a4a6215dbfbdc2b0a8a8b71936abd61642b5fd1a0c1d06ba548ad3025e01000000000000001e9c3192d1c2e7e1d5aa731c1bd3ffac1b55bfff1cc1beb0745a6b54b4b32b180100000000000000fca464b97dee2e318ad8d4516fd606a5401f5d15467110112a3326ef96ce00760100000000000000bc3bf978ea283cf493b43928b605309be31def9d4a1daf47788017ac61c7c81b0100000000000000cebdabff22e607a75aa8db1bf875511a563200cce3f089972aca719649b6e1760100000000000000382fb32d7c8868ce3765e9ccfb462c04071a3d70cab3382c796a9115ab0c310301000000000000008a6dbf87f769167b4eb982f63b946f96a1f223b6a6f2789183fec09581b8e906010000000000000056927fdc8bff2063e108fe1b05bbde2f6219bda7d8663fafcf3d2976c72153590100000000000000b027ae418b6c79d9f3a2b05df499d3aaecfb327e6b9d7995a022dc5265ed76180100000000000000eed7e8e8a64dfa89c548a31c1b9fec7af5aef4dbbdb26997b2ddca72d4f8790c0100000000000000fa49d3457520dd98ca1489b78354d7d30a9bdf2181140072ebda1c3dc3371e450100000000000000a811cc491bb3487d5e604dcf6dca3bf529437162f3b8cfb8514ffab16809ff600100000000000000fe2848018ac215f72f551e58dd2d065d99b788b5a7aa59b9f9fe47a5bdbc046d0100000000000000b6ed5b0c17ca7560c71f1778694741009d3da979309617f0bb992084019e2529010000000000000078cf1debe3fc0da2ed2473d1e1835a478cc3e7008e0cf42043f287bc36804b710100000000000000f853a1534a3af56217661420536dd7bea0db6f6db843d8fead77c308ed7dcc7c010000000000000032e2c97e308c84afea4b37d7dd8f62e67763126c357c9e6e49b27f54c3702b73010000000000000050d2e3ed042861cfddfecfb31d47caa1927064cb0372213a3015b2acdf1dd1450100000000000000343a9649237a3b9ed165df5a8b6655996a9920091530b4896b0edfa3afefa60e0100000000000000ca9919b307ac6204475ff029334863d464042fdb84da988119b6392d5862cc78010000000000000002e12aee8fa547e191b4395503c28d4b14650c1dc03c698d73f4cd30f03de90201000000000000004050f1025e1481eedf4d787eb4232123b271e5196dcd8670d754836297d0da7201000000000000009c5d3bb1387f53f0306bf7f24e81dafa5bf972048de867e2e517938c4ebdf7120100000000000000560c91919fc22867159ed77bee1b3e70d2e222a5fe6e830fceb13b58b0daa5290100000000000000e03e94cd4419d9cb8709ad2859e598912c78c01b15eed53ec0c336d8d6c49142010000000000000056606b6532cdbf27358fd067d61c2a65e4b3e8934c266a857320ff18e5c7654c01000000000000004ca838afa9f12e88436eacb5024f3f94c95a66c32e114f65f3136176e426c75501000000000000000c60356c02d5d99293952c478fd07b2cff982dbad863ebdadf25c9e69206f14901000000000000003a8b589c8222ede45b3d95c8d9176543ffa9a29cbfa0ba2af60fc412e732d75e0100000000000000105cd6ed1f55fde42f7c82d0667316a4f1e26e9e53d96f540e5aff8905897b5c01000000000000000884c85734b971a88cd94d86d3c62fdf163256a0387e15e2d36d8f25523a7748010000000000000094d89cb8df2b03c76d41a6521e5803d6f98e204e1839b9ea747dc7e253d35b7f0100000000000000f2cd13ba1efd67dfd5f8c9150b1a74d1ed1bad1a72c36fed96163b062e463d0101000000000000005258f48e31bc89f5d53ea6a12eea9698f8e72c6068ac1588100d8632bc674d1e0100000000000000ecf0297bddebd3d766ea7def2bac79ad6eb650fabdcd029b99cb1649ff7dc8150100000000000000121f9d8ba85d89e3c6f9a0fedcdfc9b05cc40a6d3324eff6e8a58aec5f52590501000000000000008a16fb5a6718a714296cb8fa2ca708f677f78c7f883ba3c5ad1bbb9e23f37705010000000000000038c9a0897d9caff03a308d2120bbe892974ae8cb05f1cfe8b97259f0ac2e852901000000000000003491cc113ef8fe1165bb10e65cbb461955f92f8f0d82f2dcfe6664430dab853601000000000000004e466f6a4930d856a1f53f21c1a44451ead20c8c71319f6a685f0e254d24c32101000000000000007617b69110c43683b5000788259be855890c474be8fed65d7b1dae1d534ef85c01000000000000002037d70f4c244c81422409ad01d28d72a30d26e595fbcc791daeb57f78a8567001000000000000003cfa50228b841c7d2fab03db7e4bf282cf14e127ab9b31c23fca1a79be54e823010000000000000088fa8bb07ebce99964718c65d0d6f1b091ef2f4d4cdf7b94a22c42c007ecd706010000000000000052ac28ba2601723d23a086b5d775f19319f110ba5e9292f2af461e71903b5b50010000000000000002a4b2935b657f9ec563642ab0f34e223ef594cc70c856b9bd70fbe08372156001000000000000001e2543674c697ffa09657ce9f9c4b610e46da5d73124410b327e6ba5d432263c010000000000000092e5bb9d0906f768dbdde0696b78e493cc78dc1f68789575b24f0b962799b51e01000000000000001ab9d2c814ed7a719ef2aa94dcf4db8aaa0315a59d4b5699e86656a6ee9ac56101000000000000004a512ac212da2c96d7bc8590865ce627e6b60246700595bb100b240e80a3f0760100000000000000b63f9ab3a147d76614bfb688751f79fb9a120d40af7ba3bb123c1957b91a411d010000000000000010e37a12fc6ed768d1a2d33c8abc6db675381dfe69c832abb77d9ba2341b3c4a0100000000000000fa1b0afc9ce9e9742c4825890f6d93bb87bd199e55e86ce66ba7c34ce43e273e0100000000000000f6f94569aba4acba85b7745a91caaac8a89c95469cf2b9813891eeb94327937b010000000000000042c56bdb09d52942b0fedb07045113a641e2fd64a428b1fa608b5adff9ff4d640100000000000000fab301ce05079af0f67a042f807cb17a770c0e1a2ceb3d956d569b44625df87d010000000000000086ccdecaccbf1a58049c55793916611cb8749edf93085bb764e77636357ec172010000000000000012af78070e965616e16ab8cdceb871c02e09b180e3f0a69083419196c9ec665d0100000000000000f29cb4064a1cc3a79da2c9a9f336053cc69d50bcc737257ca2f071c37030510a0100000000000000aa74176b5870c97b754a157ec0d8032148c2ae717a905e0e5e626048b6f5334301000000000000003e07b075219fc7ace8dc3bf3a06f5dc12aa9c7e45fe30244d2284bcfb1e6ee190100000000000000a4a0bc81aaad1ebce3fdf896a8d6d081ab93efc2de9d5c56f2632edfeaa7ad0f0100000000000000465242c8915eea46e25549f2ab97cfe78784f25083e51773e07d5a0cafc2de32010000000000000022376791bf19fefac611324d27bc6acb4b7f7eec713c186adbeda5a1e1b88f340100000000000000bc8f93a45201992fa9d04355095d03adeb5ff1aea206425eae4f902ffd47fe200100000000000000288c08430a7e427400dd5b61926b74a82abcbbc91ac739190cc791a581f6836a010000000000000034caa67978c1a5280b5f58196edcdb5c864b02d0fd40af9c6e6b9716f3fb12680100000000000000fecb15325d9baf603112dd397d2e83d3694414f529d75c4b639c7e775b979b14010000000000000028052d0b965ed862b7861aa7f3f91fe52ff8b0f795ff476c7e0a7aa42e79933001000000000000001c860d36fc84a54978d99ad400a719dbbef493f8631856e6def3e9ec998cde3e010000000000000036ff2156d388346076b08a5c89aa760b714eb1bd293e2f3e4c4f35049cca9372010000000000000092cca18f264bdcfc19e5c01515ea9d61a0bf0b4e46b2bcae372a428b9dc35e390100000000000000e0b770b1bcf7deb030ee75d5bad6ec1ebfe06ded0fc406a8520a9650fe832330010000000000000066a5a598bd5d484fe66e630a3e57f3b245fe0413f81401d7a5d59aeed1a3a46301000000000000003622bfbaf9350b5906bdf9ce362e06726224ed141c5d29e8e175e0beedbd3d3d0100000000000000526fdfd1d78345a1b2843d392122962cf89a4f157af2a3d0c99607f506175115010000000000000008e80cc5ada5e557a1cea3658402bc83f9892b5c4e112b6e157e6e7d3663c47b0100000000000000a6730d04d45ee4e7e25d3f7b80b4e2ac12a6644a4128127fbe97e97a1d690d6901000000000000006ed90090a744a0d55adf8f8af5af4d5198bb67220ce33fe71121d7c51f27a4130100000000000000b6ad9df8c32a78e9481e75f484fd0b740554276c026736f0dbac0987db0885670100000000000000ea82745d9978e47fc6bb25fc01383aad42aeee65662b6af304474f0e4101b06f01000000000000000a6a0f8136fafe5c2e096704e37d12b47a1e46151489a23eb1713b37769fdf780100000000000000f25d3265659fca9d24ca877823644f1223714b0167d0a676cf3c9c447173d12f01000000000000009ab493c4c8007f49a3e7d1e9f1aef39b39cd66a496e90486e62664725c6ba06f0100000000000000e0f7debc0989ef62dee42d2cfc81a07625f89e511c3baeed9e6952e66d9b6a460100000000000000ec19137bec15ab7c3cd7625e029b026746f6a90d28bf28cfd61457c40a8f26660100000000000000cc60431feaf7f1bf42d805f0c12a1978ca9b3ec0a21397a71ecfc2bb7d52d20a010000000000000066f55d4bd0b47f3cdad20c74b98e204e51bd12799df198045a1d670e3661732b01000000000000001827754b7465edb9bf4ce981bdd3a33057f9450fc895e39654dbd51c3ab9835a0100000000000000d0106f6fb9b008052da3223c389525681d9b6e4fdb73a4078f7f1949bfaa3502010000000000000092006149452119964a75232851f01361608dc0a52031f240e93e70e98a3ff21901000000000000009ad36892ec05281de9c63c7cefb3f31e448957a9572e650d9f3af1f21b2f515e01000000000000009e3b3214afe654cf851be9e564e72f834168ff65ce346ac54024cdcd9325712101000000000000005e7f927ca4edf203d65f682fae546d8d43913b253dad434800df66be1f07685201000000000000008ac742d2a3a14cefdfc819c03f5d439eb8325b7f0eeec0a9d4025784ba7e057b010000000000000098f7988d5a74a0e52f58dd3d232ac3e93ff757480db9d4c12761b04fef032c460100000000000000248cddedee20dbb65f20a1715c2490c09241f6800b72d0c4029a1c234f2ce74b01000000000000008ca0a873b2685dde8c4792832cabe50ea5a1f8a9a661a336689859319b66ba6201000000000000001cf3abc7c9d8027488ea2f5f2463fd091b194fbeeebf560875e8648fbc67dc240100000000000000ca526faf8ee5263d4006452735885dce304cf724040fce84399254d9160d6f350100000000000000d27da69172c428ddb80272e6fc6ec90985ee281b45f933e5bad65184bc3b5d0201000000000000002ab0b5cc358184be4fa29e7a3dc24806a72e55baad40ec9a117324a884242c2801000000000000005afe620da258a48f00c3afbb8a98161e977f076c7e7f8392975a4f0db4b57d6101000000000000000c3292b5065b7b78a2de5f4fe397fff21df37c0ff7eef94c5fc4397f760e6e4601000000000000009afa4df63a9a72e8dd0710638b6b6a10e37fbe2ca640f828c0f943e5ea38395501000000000000009a62ccaeef1677fa3fde2e172bcea58f695a34304ccf5594b74fc7a7ce9fdd0001000000000000004616ac86f0d45899eed3f1246dc5744858a694a92b0abd9f10e52dfc9c28674601000000000000009281394b5d35827c826e1d7444f346c247b9a004aa0292a9ca2b16e0fb5568770100000000000000683ce8ca29f09be942c929571aaa188b89625f28569721b41eb48329dc1b4b0a01000000000000007e88cd54f47c1f4ddd9d3a198fc689d24a523fe186d526b14e476f14ced7db3c010000000000000058efa50da673a8c3b5799e278ae7d32f9eee340947f793f44348ba17e25a885f0100000000000000b842693f8e988a596491b840510f98489ae286129b41fa51b8331ca3b82da7590100000000000000e6a08fa6af54d2308215f4a62d554dd5b82deaec8ba22a2e6ebade7202ab9e2101000000000000003289fb8751519a2f8d56df55e5491439852a63aa916d9d779cbf574df9a5d86e0100000000000000b85b1b7b8ed510a5bc1d0979fdc04ec7b73d84c7d1d767dafb6faccc8dfd402c010000000000000038ab6c4b18e1c86176cf53301ea990f1cdddcdc3f2c3e0f8dde126fa59f60b2f0100000000000000386bcf52f4c464e6a18169f776d69e90880301f01fcc8cc0ba451f1d7e6c3b7c0100000000000000b41546275611fa185c88c7016e909222b3a757b476316766a72729d074d8e92b0100000000000000a8d082a4289fe5ccaada604e70c4b1473d6fae4374663672e61474852c1ebf2a0100000000000000723f8c9d81d0874cd4130cb58587c90ef454174e9d6d9dec11279a553caf00430100000000000000309ab613bea03c4431f7602c937f5a4d17e2102db6fc7f77e32f7a245041b90c0100000000000000e0ee8ff76b364ad2ccc3e82e69cd700c0895607a449c5af3745bb3018a184322010000000000000069e31581291fb1d743f0e22442d12c828c5b1e0d6976003991273662361969e0010000000000000004000000000000000299ed11844881f9a3e6791b1032a0e229db03a40fd8c5634cbacc85757c3c1b92abaf2b01011d2000000000000073eef910000000006009000000000000a50432904ec260963195582a1d339f9fbd2d5d76f551160105c922423cad0d94482f010000000000000076441c448aefcf40a72128edc9b44a4f7ef9c267c503e98f5f9c72d5e9e92f000100000000000000526e055ade4ac425e9b5f93ce4394601335d3599a5b742603126d78ce99a4a54010000000000000072ab87b654d80294c876cbefb534b3344c2f64159b015b89221331ec214541750100000000000000643fa48931f2331b61ce9664acef49522251d1e671490d50d48aebdab81c2b3101000000000000008008c1b7061a2402634fc15d3849e2913863beb9f55024bc8cc7fa7d6e397817010000000000000024a51a9bdb67213626d1b52bd8dbc0e9b94ea88ea417aa17b56212d1cea3e1780100000000000000488d520146f681678e9d229f5e29354edf65e521246b28a4175c0502e060b9200100000000000000503cafb91c14eaa2931c4507090b27170b90a2a76d3cd4669f922202c781fc350100000000000000c681c1acaa82eddba6e394ddc9a2fd1af34418448d544c34966a31c837667f28010000000000000020352ba0565811731625a8001d26f5d899e5856dedd0f9c6bc3bec2995704e5b01000000000000009cb389c209afbebda2b12113e0266b3d30f46e2a91aaf4451c193d640288357101000000000000004c9886e2e62ee92a6778d6a7928052732044b64fa61969cd8e37f3f7e3406f720100000000000000c056f1879c1fd443e38244c26ef138218b3e43e70b1cb84bd7242e354cc9ee0e010000000000000028cbfe245b9eec3bf55d8d249ab3680490644aa23a7b688e00478e7fcb0fe02901000000000000003ed19f8df1a2d2c1176df07baff4206c94f4d752de6a46c5f3f34264a88b0a0701000000000000005237e4509f24bc9e8bf9bfd78b594219d86853ae16601f692f10c9b16b88f83b0100000000000000e07afc6e4b429df62183d1e1c417703cf8467e0f1bc61f7e33954d8336c7a935010000000000000098192016f83ef2fe74dba1ecc6526efc61b79f3177c00dc7c053160391858f700100000000000000f6dddaaaa53b57763610037753656b591d90fa81efbadcabbeddf7378c23602701000000000000003e69835397599a4bf081775f9f42f0f4ee686d67c9af8eacc4a733fdcdb0290b0100000000000000f8a681118ea0bb9dfde2813ce5144eeb5cee881c27883de1c0c759255ec32654010000000000000000b84e6e296de1009aeca95ee09bc5173aec6e91b1145b247d69e477588789720100000000000000e67c524e443cda4cd27dfcce70488a5d23a93c8c46a5e83ef5a69eff3a02fa5a010000000000000024a57db63b380456d56d561d8a9da6db13d298045c9672bc4086a2e0a567d55c01000000000000006c50859d9dde209012eb3868c1a3a6e80ae8fa528ace9df68e92dbbae60368200100000000000000a8e470f2339e3ed0da456780dd9207e9c6a02459238ec3057a6ade01fd6cd60a01000000000000007c5f58a83f8101943c089dba3ab906c07811e853444aa58dbcc986c4095fbe7c01000000000000005494142902284943201b7cf610306e8665eeeec87c014d607175c3f50f76103b010000000000000072ed7192625403acef94aa9189f9f179deb89e60478816ca96c79b742f757e750100000000000000b4ffe3c5959ff37c11c6f19d91926cb97aa4bf0f604919e1753bb55664d061680100000000000000bc4c9b5425f9a2aa09e3239332c702dedbfffa2b9f4cc1b978b307fc1fa1337c0100000000000000e07d5b19d98a6f8ef5c964b507fcd88f500a2a0a9afd5cffe9d4e3f74d83b27f01000000000000004e2753547f6ec0a896bcbc55b9eeab875e8019acdeb10b979210af63f24c4b74010000000000000042e7851b82d8b7722b9eeb5eead57b21bf533fd25acb10542a52889376fc3920010000000000000028ce9c093ac772f56acb8dfe8b33a3966d4b8699bd41814117352d397195bd5f010000000000000042ad4ba7e8a60af1abcee04fdd82ad02b24f1e2535bdb1abcdde886efbf0fc4301000000000000006ec27dfa7ac9d35eb002c55d3e4d56b4df928dd5c44323ac228305741c9e09360100000000000000b89cbc83a386d6f5d4fed93289ee50fdf69d77369ca0c9a8b962554e3fc0d37e0100000000000000e61da4eefdd14434952c58dd1943f7f63185d03321ccc8835e4216badd16fc190100000000000000722d7d57085c250af633f2d461874d59aebc8021eb1112ec8805db5ddea53e5a0100000000000000a20797f3a8669a909adb22a3aee2844dba82d231cc33f5d9be0e2c533cb82a6701000000000000006a1274b6748bf822ba80c9a9416abd3cf591b7aee6adabb8359b7dbed8ebb3770100000000000000dc1274e0689c7a3eac31b41ce352719529e65c01f26999f74ce17c9905fce87401000000000000009c9bc1074cf465c0dd39f74bfdf16a67f81339ba2ad117a0c7030b4f067877170100000000000000d8b38c77823eb1912bf8b743cca6c655ea1844ee468fbd78b394bf222bf8bc2001000000000000009a6223b8a7aac3a28f958d9f6c6abf55f87a38cd22fa563d6327a4d86da7b64d01000000000000006ca924ff8f8e69b8ea54dc988c67fbfc1d955f357f01e5ff4b8362ad7d756c3701000000000000009e280c8deea88069fe5118eefbb994d01373ff5dc213a65d06e6873b528f6c2f01000000000000002834c706b030a82a81ec43e2faf26a7d00392e1d8f2de8b7a876183ab612cb180100000000000000d0189a530b4048501596c4530054fe89f017360402da0ac197a8100ac693b06e010000000000000006ced0dafbe316bc507cfa57f506a58ad57ba7a69a8291ef87e8f0f5dceff6040100000000000000364360b4881f0f2831a226a422c79348776d43a2365dd636dea05a09381f8c2e01000000000000009092f9e937617716876caae2eee008bd44b0d0ed3f3af47073dcab55fcb1d5740100000000000000a86c7bdf11794e554439b09f9f294c8e0abaebf447c7bc54419434b8b95f864901000000000000009e9f565a8cb6e8f2154a9833735930a04003505856c3743a0f71afe64c7acf710100000000000000b6397b9e34e46715868bbaa83cb67dec4d78ce992f4a9c973e6fc1e2dde3d76b010000000000000028a027ca1c0bdeebfc8fce85ac4bac48cc072523d9c4a86b4f2594f9142e7e3b010000000000000042e4c41a899dfb238649e5b17dc232c2699353635d60e6a3bdcd71f9b82cda300100000000000000ce4bfd8c5611b1637066ef9e579c85efadfc9513b882184e00b75871ef7f5a2d01000000000000005c0419f37036f2bf999f3958b49f63ab19d6dc19847a393dfd26cf303fc8d911010000000000000028558e46037c51ece4d39a8a4d34688662e629413c221d6226afe454240e70210100000000000000e8308668e9f16683cc739791a6dd530b819f45e4ade2113ee2f27eed1c51d1200100000000000000e41b3ecad757b0a5ecbc6b29691681df25b3d2b5f1ea325b648e607a5d76cf080100000000000000be03fe6bc03a7884524047567a8ccf43b3c988bf3b447ca9e1520d1c1f83c53901000000000000005461977495f9c407a8d951e860a1cb2087592103229bdbd879629cc538a4182b010000000000000026d421de2e7251020ac2f8b8c7e348aa904dcaf0b6d5d73fa0113b476f7dd9030100000000000000bc56c07cea21bcbbe058aedd2ced9fb4757caead55f96bda9bed1c9669c32b64010000000000000078e1a4fecbaac940c04e0b591a01ea66a574b5098852ded2810e3a534971111f01000000000000006ccf2ce8e149999a7bb996faa65194e60aeb7bcd1937c787f886fe979fb49e6601000000000000004e5b37f3ecd0fb3131aba488083c145d60b924ef98b286a0066e0ded309e886b01000000000000001e866bed92016cd2dcabe2d87fcaf8c1d7248255cafb9e10638fc3a2b476221b0100000000000000946071eab9c0fa1de9be2ad3c18041f1326faab41d84d9daf9f89c0daf9c0f00010000000000000082b820c5bee8ee77e35203dab387f3434b8502e5f1c35dfb2ad15b5c89d47b3c01000000000000001cf3446b4b5116a1784d92cdc5101e55a5fb91ed3d93efccd06b304a94362d0a0100000000000000c6d5dc6e1ec83491397390449d8cddaa88631e8855efe50697788a93de00fb5501000000000000003a4b0919068523aa04ab29f1b49bdc03a176a4b93f9b5a7e6e0cdcc8318691030100000000000000b288a9832e07bef83c5a8ca72c5a5583b321672ba7c6cdd44a971f855d32d95c0100000000000000d04077347325618eb5cef03729a157b910fac54ec7e344e65b6945fb9fbbeb3b0100000000000000fe3b55d17e25c44a3568885d9d37276df81fa5225d9d73ee67321c7826581b5a0100000000000000faa52c51af82fe8fcdde5ffa213721a8395acf22e30bbd2aa420626571e6183d010000000000000040a2527ffa7d30d788eca127d435c8b5aa48972cda538b9a1627a57e85c8fa190100000000000000844b691aa95ff9a15b50f5e5f4f0e582db6621326cf18d7533f55bc27549497a01000000000000009c1863aefa0b4d5f3d48275769ad0ed04e1428db9694d83b9bb8b5d833f1b41101000000000000007c4b93d862704aad434ab3dc2cbef824df738c5dbe1ba7b34daa38b2aabf7c36010000000000000028e972febaf463f22d1108053e7c26ccde1e6018d7c302985bc227557e0a663b0100000000000000261ac3229b4bb7a376c37f17e287b2eb596d3b478370b722b6b41443d8708132010000000000000080413d2894759b53a03874bf96ffcb66117e4a08ad7f159c008f2b3b6cfcbb470100000000000000ea885fca10a9473631bcca2549cb8183beef534a7ee2bd59a0a6f74d97bcfc4401000000000000001a36d936f4692ac8387ac0ca1f051970ae480271e39fc134436b86b8ec83b25d010000000000000026d7422872cbf4d4918046f240a13a37219a272f4326b3f3bd1249829bbcd12b0100000000000000be6106f9217a1847af66de9510fdfb40514409556506ddc1c1a897818434125b0100000000000000e03dd3bbb140ffa44e0cc0e1846967b03aecccac78f6e2e0a1fd3ac0d34f554a0100000000000000ae2e94f092fbcfe263519f950b5ade09c474258a4e0d5e62570d02b3f71d85480100000000000000bca6409d6d7e4f94ce797594db4363bb8bebd5387770aee0bb7663b36354fe2a010000000000000088b8e0da91c48fd9bf94ca5ed7fb74797a037e626c98ac18cd76360ccd6ac11c010000000000000086c1922e4ed392d72e0fbc0ee28e7ec0a8ba2b33470330a606cec9a159a796260100000000000000344589372873125fd660e2ff3ad9bf67230f9306acccaea070aed322a8ede264010000000000000036465f4be77147914969ea78f8e39610310679011dfbb6137dab12e18a687a52010000000000000098cd0a4eae6f560a9e760f8b806b36861b805798b4ee0ada29f6841855d51d030100000000000000584bf60b8b17ddaf70f87f371bd2b425a3637e05c1b75469f45ea85717063b6901000000000000004c5e6997b6f186855b1f4c9f8ab2d6cea3da2e86445605ab89e5b5821e05bd3d0100000000000000f85f12f4fb92075bc59a1711f35e8f3c8313ff08028d2af80a79b3682a3785590100000000000000f8db92b1e5f6e9a7f23435a2aadab56d5ab7746c978965d924de2f89ef063c21010000000000000004ba7eb24012b133b20a8021b603a1483c4a5b9ad3415a4d7ca2b1ad625719550100000000000000202e3405e49bb882f1d49efc4a4adc5b62dcc96ec18346a48aad5a510c189b5001000000000000005c39533cbb607f1f52d82356d267a56399045e0d7b7e95887cfd8ec13173db2e0100000000000000b045bf0235bbe708e4d6918758650c9c7f9ab4d638e4a841807ed7c82ff7f63a0100000000000000ea6acde5149e930af7bc3b17b7f0bdcf12dfd3dc3437f774f823bbeef420a97201000000000000006e7a78e9fdfe275f3e000382ba30452729970578258839db6c0fc568e20b35150100000000000000800dd25a7aea3fd7359065185cb35b4a2fad0b81b3d58de638e6764dc8a8211d01000000000000004e1b48e67c1e62e46add39fa523b956946228ea0f08bd9d20ced798cfc9a0f5b0100000000000000faa6ae896c2d1040e495acbdcd8d90a02ccb17ba6e507efa2f7deacb3b28466e0100000000000000840290d318350bff32db3dcf6138b822cb2adf1dedf5bad8729471988955915c0100000000000000907ff7ac1e6c451d236c05c8d3f85640d9f9472d6a30115fc26135dae020e638010000000000000014e2f25dd3376eb7978d413c14322704a2ff3d9c0c2971acdcdf9720c2c13d6b010000000000000014cf97e739cfd033c2828f25ad3f15e8f6ef62ba97dd74164e77e61eb85454260100000000000000a07f151db53097c2da9dac4b2e0f194931a677a3ba99df0f3976e34409fd64760100000000000000d8faee17dcc461acb22ca1720b86385414ea8810ba31509fbd8da8733029eb1901000000000000004cc9ff5edb36e361b088b0eff52fc6e6559c1169ff87ccdb62503bceab7c74450100000000000000f820a8ed2c97f639fea2892d0a89ae98ffc4c0054f948f9a0108e4d99f89994c0100000000000000fcd5f4c4fe11f20ad99dc8345b7dc5600caba5d5b7d3f499c3253c095152d45401000000000000005eac8ac37c95fc11921839550a30ef071bbc80fb10ea1482cc67818e184d544a0100000000000000ea2b17bd1b69a7b442dd000db0f12f0bd4bf7a87a540427986bd32f3d3bd55580100000000000000142445d894c1236a38c6b1bcd9f5a7245897026424ce9544002008a7702c3b1d0100000000000000d6acabff06fe9a6ccf02f780f33902672fae0f038d8e19ee234ce28a0b6a01410100000000000000780e4353aca40b0f2b2403c862cb33032d49a820244bdc2853ce158d48c4f610010000000000000020778d1b86af98ab30d7adea5f3a4f215d6d4a9fdc892d8999275b2c311fb05f0100000000000000b48cf50a4f94e83450a791d6de965c3e8127c1c915208f2b85df4c3a84b2042f0100000000000000ba12ca0e39666950f91cccac64a409fc9216e0e6e7466d26cbcf7925c3d0fe120100000000000000c60a9f5f89ea3a56499bcd39bac7e038c25f5b7720d873fdc12b68d2531eb650010000000000000040b77fd8fcabe868dc7f2a08bf14c67e4d433886c3cd3738d1b0b9c649bafc230100000000000000cef0feb2602582b96fec882181d34bd5504645c544c983b1a962188239eed90a0100000000000000b633c47d126eceb0e36d788370ebaa179b0c7a3a21cf5f1421bfac40c895ed3c010000000000000092ee092cd2215c7c1628086c08be10a3cb969f6b276f600422f3526f303bd878010000000000000086cca25ca588d995ba36f447a87ee00073a24190e8335247875e1bb25823f845010000000000000022333a4409728530184f55b95171d2ddcec037603382fc7d6443b1f7b96c813601000000000000009acfd215519f40156749868afc8d56e015759f71cf183fe68382e8c02c75b2510100000000000000f44b3ec5c7b2188f208d60d159d1f5b0914a51a0632eacea6b88ec7b26d6673d01000000000000005ce79c3ad8a0e1806e863f0858c28a81408d19870a62ac0316b3e6345cbb5f7601000000000000001cbfaf2b91ee79c6288ad01dd5787070b34d5e1b8253a1765904eaa7d0b93f020100000000000000b672ee2f0f9183585ac4875368a0defda6d3c81927fbfc34bbacc7481058cb4b010000000000000036a547b4aca95274437f3876bec0447f775eacd01b09d95869390d326a596d450100000000000000608b753074d6a1fd8e099224a7495f61e3db2cb91e1e88553113057a5f49533301000000000000009ad5ff7033b5708f5de5496a94c16fefa6de45ad641910b81d6699c37888435801000000000000003ed1ddb7a3c787fb4b4ec4b71c6d8b8227ec5b2b74206be0df38c9e85af482040100000000000000a065f45a353f24ba187248aacd9c64d5c3a92ddf92b4a5c33994f56a07cea8400100000000000000407e78f505ae833a2eaea113245bf6a5ef6abd0db66141f770cd6cd7a7e75d7101000000000000009c576fccaf2ffb4885a0ac8ed7ba0b80ee5fd060856fb9f80bdd3219e5d7800d01000000000000000c73fd83ff0d798ecd6be0518e340dd60c45bdd386c95236ad1db6b1572f1c7d01000000000000004678cfe8b5ab7811861b19336b572f9c7175ad92efbd8a031e5fcdda58173f51010000000000000078c91c4ee02089ea86612f66d6022a0cbd54afe470a162a72036611623924f6d010000000000000092d42adbe88eb57759aac9f72ef4a88c3459635bf9886f4613371efd4e7fd14a0100000000000000e682cc2e71eeebb447a353fdf541b2ce7f9920ea1ad2d832bc35e3b49169bb6901000000000000008ec5856a5fd17617c0af76efea16a87d0c5e769eaad39e91c40dac93fb067d5d0100000000000000b2967e3480b89af39e38367f948fb287568f27bfdac4b65fbc9d97536c79c7000100000000000000f60b5e74957220ed7664befb71e9621436e40f2b6c1bdb1c90a6de9c3540a84001000000000000002a98fbaf7ec22832522e3f96821711ef684283911a524960efb14953255baa2b01000000000000009e5b6a03be0ed1cb27d61340f02efd1a285cf73519dead55195f001ffa274d410100000000000000d0389974c754c672124ce98f5d49f4582fc60aae5fec560b5c332a07d835412d01000000000000004ed5f55ec45727a57e2d8d6914f6d2acffb17b9515d347ba045067502a0b140201000000000000004cb98af1a70e917453f5dea682917e7b3077ea9d41dda7764433258a9d5db54b01000000000000002a0fda136ae348db338b87bed349145a94ce091227774b0542e533a83d1ba455010000000000000036c5a061b47768957b2b939b2e37e4cdf8825a4abf963c4f912f3ba4cd567f1e010000000000000026fa6b3ccef89437308d6c893173c45de62e3c2cca8b6a67ad951ef8127792240100000000000000a6cfacf0aff2d5c6e8eadf71f397a64f2863e5f0b8793e3068aebd5b3030e13101000000000000006a5607bc375d7ac0908e7643ea2e89dbe42f4f805c2fb6e2a22d0385c1232b310100000000000000f4ccdf83d734edcc568462572abaf32d22ac7faf8000195e02273d1c9665430801000000000000007eb2b0b6adbe5a5bad38f46db207f94c896d419661f4ab8f21e302a543df9b11010000000000000048ce0aba6f1554e139568b4d2358d6cca9bc291d3600787cc3e732291002ca2201000000000000007a07e4b6b4daf45f4af2a98e7458034447ae0e67e9a22596848e58d4ba73b9530100000000000000469d81e8b43725a64da6b1ce10eb53eebe1aaebb9703f75ed452e12f45d262730100000000000000c4c5fe47a568c2fe4876eafd5e0093dcc31b450eb87bfe58397dfae2a590d4650100000000000000fa5a4da949ce29dd0fc20fe56c40d63ffded8e2dd88844f725efda0814ed526401000000000000001cc40fa83cd0a4431aa63315b55c669370a4037756089f3402a9021e2d80666401000000000000003ce775a4a6215dbfbdc2b0a8a8b71936abd61642b5fd1a0c1d06ba548ad3025e01000000000000001e9c3192d1c2e7e1d5aa731c1bd3ffac1b55bfff1cc1beb0745a6b54b4b32b180100000000000000fca464b97dee2e318ad8d4516fd606a5401f5d15467110112a3326ef96ce00760100000000000000bc3bf978ea283cf493b43928b605309be31def9d4a1daf47788017ac61c7c81b0100000000000000cebdabff22e607a75aa8db1bf875511a563200cce3f089972aca719649b6e1760100000000000000382fb32d7c8868ce3765e9ccfb462c04071a3d70cab3382c796a9115ab0c310301000000000000008a6dbf87f769167b4eb982f63b946f96a1f223b6a6f2789183fec09581b8e906010000000000000056927fdc8bff2063e108fe1b05bbde2f6219bda7d8663fafcf3d2976c72153590100000000000000b027ae418b6c79d9f3a2b05df499d3aaecfb327e6b9d7995a022dc5265ed76180100000000000000eed7e8e8a64dfa89c548a31c1b9fec7af5aef4dbbdb26997b2ddca72d4f8790c0100000000000000fa49d3457520dd98ca1489b78354d7d30a9bdf2181140072ebda1c3dc3371e450100000000000000a811cc491bb3487d5e604dcf6dca3bf529437162f3b8cfb8514ffab16809ff600100000000000000fe2848018ac215f72f551e58dd2d065d99b788b5a7aa59b9f9fe47a5bdbc046d0100000000000000b6ed5b0c17ca7560c71f1778694741009d3da979309617f0bb992084019e2529010000000000000078cf1debe3fc0da2ed2473d1e1835a478cc3e7008e0cf42043f287bc36804b710100000000000000f853a1534a3af56217661420536dd7bea0db6f6db843d8fead77c308ed7dcc7c010000000000000032e2c97e308c84afea4b37d7dd8f62e67763126c357c9e6e49b27f54c3702b73010000000000000050d2e3ed042861cfddfecfb31d47caa1927064cb0372213a3015b2acdf1dd1450100000000000000343a9649237a3b9ed165df5a8b6655996a9920091530b4896b0edfa3afefa60e0100000000000000ca9919b307ac6204475ff029334863d464042fdb84da988119b6392d5862cc78010000000000000002e12aee8fa547e191b4395503c28d4b14650c1dc03c698d73f4cd30f03de90201000000000000004050f1025e1481eedf4d787eb4232123b271e5196dcd8670d754836297d0da7201000000000000009c5d3bb1387f53f0306bf7f24e81dafa5bf972048de867e2e517938c4ebdf7120100000000000000560c91919fc22867159ed77bee1b3e70d2e222a5fe6e830fceb13b58b0daa5290100000000000000e03e94cd4419d9cb8709ad2859e598912c78c01b15eed53ec0c336d8d6c49142010000000000000056606b6532cdbf27358fd067d61c2a65e4b3e8934c266a857320ff18e5c7654c01000000000000004ca838afa9f12e88436eacb5024f3f94c95a66c32e114f65f3136176e426c75501000000000000000c60356c02d5d99293952c478fd07b2cff982dbad863ebdadf25c9e69206f14901000000000000003a8b589c8222ede45b3d95c8d9176543ffa9a29cbfa0ba2af60fc412e732d75e0100000000000000105cd6ed1f55fde42f7c82d0667316a4f1e26e9e53d96f540e5aff8905897b5c01000000000000000884c85734b971a88cd94d86d3c62fdf163256a0387e15e2d36d8f25523a7748010000000000000094d89cb8df2b03c76d41a6521e5803d6f98e204e1839b9ea747dc7e253d35b7f0100000000000000f2cd13ba1efd67dfd5f8c9150b1a74d1ed1bad1a72c36fed96163b062e463d0101000000000000005258f48e31bc89f5d53ea6a12eea9698f8e72c6068ac1588100d8632bc674d1e0100000000000000ecf0297bddebd3d766ea7def2bac79ad6eb650fabdcd029b99cb1649ff7dc8150100000000000000121f9d8ba85d89e3c6f9a0fedcdfc9b05cc40a6d3324eff6e8a58aec5f52590501000000000000008a16fb5a6718a714296cb8fa2ca708f677f78c7f883ba3c5ad1bbb9e23f37705010000000000000038c9a0897d9caff03a308d2120bbe892974ae8cb05f1cfe8b97259f0ac2e852901000000000000003491cc113ef8fe1165bb10e65cbb461955f92f8f0d82f2dcfe6664430dab853601000000000000004e466f6a4930d856a1f53f21c1a44451ead20c8c71319f6a685f0e254d24c32101000000000000007617b69110c43683b5000788259be855890c474be8fed65d7b1dae1d534ef85c01000000000000002037d70f4c244c81422409ad01d28d72a30d26e595fbcc791daeb57f78a8567001000000000000003cfa50228b841c7d2fab03db7e4bf282cf14e127ab9b31c23fca1a79be54e823010000000000000088fa8bb07ebce99964718c65d0d6f1b091ef2f4d4cdf7b94a22c42c007ecd706010000000000000052ac28ba2601723d23a086b5d775f19319f110ba5e9292f2af461e71903b5b50010000000000000002a4b2935b657f9ec563642ab0f34e223ef594cc70c856b9bd70fbe08372156001000000000000001e2543674c697ffa09657ce9f9c4b610e46da5d73124410b327e6ba5d432263c010000000000000092e5bb9d0906f768dbdde0696b78e493cc78dc1f68789575b24f0b962799b51e01000000000000001ab9d2c814ed7a719ef2aa94dcf4db8aaa0315a59d4b5699e86656a6ee9ac56101000000000000004a512ac212da2c96d7bc8590865ce627e6b60246700595bb100b240e80a3f0760100000000000000b63f9ab3a147d76614bfb688751f79fb9a120d40af7ba3bb123c1957b91a411d010000000000000010e37a12fc6ed768d1a2d33c8abc6db675381dfe69c832abb77d9ba2341b3c4a0100000000000000fa1b0afc9ce9e9742c4825890f6d93bb87bd199e55e86ce66ba7c34ce43e273e0100000000000000f6f94569aba4acba85b7745a91caaac8a89c95469cf2b9813891eeb94327937b010000000000000042c56bdb09d52942b0fedb07045113a641e2fd64a428b1fa608b5adff9ff4d640100000000000000fab301ce05079af0f67a042f807cb17a770c0e1a2ceb3d956d569b44625df87d010000000000000086ccdecaccbf1a58049c55793916611cb8749edf93085bb764e77636357ec172010000000000000012af78070e965616e16ab8cdceb871c02e09b180e3f0a69083419196c9ec665d0100000000000000f29cb4064a1cc3a79da2c9a9f336053cc69d50bcc737257ca2f071c37030510a0100000000000000aa74176b5870c97b754a157ec0d8032148c2ae717a905e0e5e626048b6f5334301000000000000003e07b075219fc7ace8dc3bf3a06f5dc12aa9c7e45fe30244d2284bcfb1e6ee190100000000000000a4a0bc81aaad1ebce3fdf896a8d6d081ab93efc2de9d5c56f2632edfeaa7ad0f0100000000000000465242c8915eea46e25549f2ab97cfe78784f25083e51773e07d5a0cafc2de32010000000000000022376791bf19fefac611324d27bc6acb4b7f7eec713c186adbeda5a1e1b88f340100000000000000bc8f93a45201992fa9d04355095d03adeb5ff1aea206425eae4f902ffd47fe200100000000000000288c08430a7e427400dd5b61926b74a82abcbbc91ac739190cc791a581f6836a010000000000000034caa67978c1a5280b5f58196edcdb5c864b02d0fd40af9c6e6b9716f3fb12680100000000000000fecb15325d9baf603112dd397d2e83d3694414f529d75c4b639c7e775b979b14010000000000000028052d0b965ed862b7861aa7f3f91fe52ff8b0f795ff476c7e0a7aa42e79933001000000000000001c860d36fc84a54978d99ad400a719dbbef493f8631856e6def3e9ec998cde3e010000000000000036ff2156d388346076b08a5c89aa760b714eb1bd293e2f3e4c4f35049cca9372010000000000000092cca18f264bdcfc19e5c01515ea9d61a0bf0b4e46b2bcae372a428b9dc35e390100000000000000e0b770b1bcf7deb030ee75d5bad6ec1ebfe06ded0fc406a8520a9650fe832330010000000000000066a5a598bd5d484fe66e630a3e57f3b245fe0413f81401d7a5d59aeed1a3a46301000000000000003622bfbaf9350b5906bdf9ce362e06726224ed141c5d29e8e175e0beedbd3d3d0100000000000000526fdfd1d78345a1b2843d392122962cf89a4f157af2a3d0c99607f506175115010000000000000008e80cc5ada5e557a1cea3658402bc83f9892b5c4e112b6e157e6e7d3663c47b0100000000000000a6730d04d45ee4e7e25d3f7b80b4e2ac12a6644a4128127fbe97e97a1d690d6901000000000000006ed90090a744a0d55adf8f8af5af4d5198bb67220ce33fe71121d7c51f27a4130100000000000000b6ad9df8c32a78e9481e75f484fd0b740554276c026736f0dbac0987db0885670100000000000000ea82745d9978e47fc6bb25fc01383aad42aeee65662b6af304474f0e4101b06f01000000000000000a6a0f8136fafe5c2e096704e37d12b47a1e46151489a23eb1713b37769fdf780100000000000000f25d3265659fca9d24ca877823644f1223714b0167d0a676cf3c9c447173d12f01000000000000009ab493c4c8007f49a3e7d1e9f1aef39b39cd66a496e90486e62664725c6ba06f0100000000000000e0f7debc0989ef62dee42d2cfc81a07625f89e511c3baeed9e6952e66d9b6a460100000000000000ec19137bec15ab7c3cd7625e029b026746f6a90d28bf28cfd61457c40a8f26660100000000000000cc60431feaf7f1bf42d805f0c12a1978ca9b3ec0a21397a71ecfc2bb7d52d20a010000000000000066f55d4bd0b47f3cdad20c74b98e204e51bd12799df198045a1d670e3661732b01000000000000001827754b7465edb9bf4ce981bdd3a33057f9450fc895e39654dbd51c3ab9835a0100000000000000d0106f6fb9b008052da3223c389525681d9b6e4fdb73a4078f7f1949bfaa3502010000000000000092006149452119964a75232851f01361608dc0a52031f240e93e70e98a3ff21901000000000000009ad36892ec05281de9c63c7cefb3f31e448957a9572e650d9f3af1f21b2f515e01000000000000009e3b3214afe654cf851be9e564e72f834168ff65ce346ac54024cdcd9325712101000000000000005e7f927ca4edf203d65f682fae546d8d43913b253dad434800df66be1f07685201000000000000008ac742d2a3a14cefdfc819c03f5d439eb8325b7f0eeec0a9d4025784ba7e057b010000000000000098f7988d5a74a0e52f58dd3d232ac3e93ff757480db9d4c12761b04fef032c460100000000000000248cddedee20dbb65f20a1715c2490c09241f6800b72d0c4029a1c234f2ce74b01000000000000008ca0a873b2685dde8c4792832cabe50ea5a1f8a9a661a336689859319b66ba6201000000000000001cf3abc7c9d8027488ea2f5f2463fd091b194fbeeebf560875e8648fbc67dc240100000000000000ca526faf8ee5263d4006452735885dce304cf724040fce84399254d9160d6f350100000000000000d27da69172c428ddb80272e6fc6ec90985ee281b45f933e5bad65184bc3b5d0201000000000000002ab0b5cc358184be4fa29e7a3dc24806a72e55baad40ec9a117324a884242c2801000000000000005afe620da258a48f00c3afbb8a98161e977f076c7e7f8392975a4f0db4b57d6101000000000000000c3292b5065b7b78a2de5f4fe397fff21df37c0ff7eef94c5fc4397f760e6e4601000000000000009afa4df63a9a72e8dd0710638b6b6a10e37fbe2ca640f828c0f943e5ea38395501000000000000009a62ccaeef1677fa3fde2e172bcea58f695a34304ccf5594b74fc7a7ce9fdd0001000000000000004616ac86f0d45899eed3f1246dc5744858a694a92b0abd9f10e52dfc9c28674601000000000000009281394b5d35827c826e1d7444f346c247b9a004aa0292a9ca2b16e0fb5568770100000000000000683ce8ca29f09be942c929571aaa188b89625f28569721b41eb48329dc1b4b0a01000000000000007e88cd54f47c1f4ddd9d3a198fc689d24a523fe186d526b14e476f14ced7db3c010000000000000058efa50da673a8c3b5799e278ae7d32f9eee340947f793f44348ba17e25a885f0100000000000000b842693f8e988a596491b840510f98489ae286129b41fa51b8331ca3b82da7590100000000000000e6a08fa6af54d2308215f4a62d554dd5b82deaec8ba22a2e6ebade7202ab9e2101000000000000003289fb8751519a2f8d56df55e5491439852a63aa916d9d779cbf574df9a5d86e0100000000000000b85b1b7b8ed510a5bc1d0979fdc04ec7b73d84c7d1d767dafb6faccc8dfd402c010000000000000038ab6c4b18e1c86176cf53301ea990f1cdddcdc3f2c3e0f8dde126fa59f60b2f0100000000000000386bcf52f4c464e6a18169f776d69e90880301f01fcc8cc0ba451f1d7e6c3b7c0100000000000000b41546275611fa185c88c7016e909222b3a757b476316766a72729d074d8e92b0100000000000000a8d082a4289fe5ccaada604e70c4b1473d6fae4374663672e61474852c1ebf2a0100000000000000723f8c9d81d0874cd4130cb58587c90ef454174e9d6d9dec11279a553caf00430100000000000000309ab613bea03c4431f7602c937f5a4d17e2102db6fc7f77e32f7a245041b90c0100000000000000e0ee8ff76b364ad2ccc3e82e69cd700c0895607a449c5af3745bb3018a184322010000000000000035df8c67b3e36862a6d20e58b429c739fe60cdcb14a977335c692cf84061672f0100000000000000040000000000000002", - "babeFinalizedBlockWeight": 4905142, - "finalizedBlockHeader": "0xbaf2c66b730543579b98aac3c82340520834bd8edb0825504768951a28f039c29e0faf0438c607f9e2b5704ee47af74adc75b555a5d9bbdfaf00caaed4642fc05318e8de41565cf4a345b56c5a24d8c446567c16929f2279c904371363048fef12c7013e0c0642414245b501033f0000006df9f910000000009c40b3360d552bc490667bd8a20a3ce5e6322f3bf196d98e65e4c6f720e5b84a18c53a29473c2731e3a029bf4170042482be4b4a539a83a247db59c5879f440ebee6eabb0526d1f8927754cda5fe9d46094d313edc5f6a1be6c3bf69641a190c04424545468403b2c2b8932a78da0ef27b6e51f96b877954d11041311ac99533f2903bf3c71cf7054241424501015a8edff0a718f96d27d5a4f975882a1ed4dddc3d137717f535600ca66f13710f68686b9dfa9c9365cc9883aaf2608cd39351a4cbcfc9b55d28fd72cb7ca8f08d", - "grandpaAuthoritySet": "0xa5046f706506065685b322054d22e8a1f23ca9df75c32a88dda5214ad58b553b4cca01000000000000008a239af78d4659897af698b5670533fa6d215864be8c41e3a2fc4309f9f83dcb0100000000000000e2b9e72d9202e99526fa626d9a6651dfd7c1daec8fc6ba1130af96f7d21a42da010000000000000047f940bc985355be7187c709ded2b689b66d69e61e293a507f1d4f90bdbeceee01000000000000001bae9b223279cf7f43805d7158bc4a31a981be184f969784091af289f854a0a801000000000000004a3fc0fe1020c7f460c7bd23d0b657c03368552b2f0a12d80a1c406fd066e0db01000000000000009b992b5e9b99eb2cd3b2b648d6db81ed722a2feb4938d998b58dcb5d159fadfa0100000000000000aee9de3938173700b3e3f4fbf2b200ae296173a0854157f40de2598dd4cad8f10100000000000000ed70004b41d483626fb8080957192ded96e08afe38fd0d185ea02bbf3b2f6a760100000000000000243f110deac5efe8e963d794eb8706a1895ae1942523ab0fe9e1623515b7dea80100000000000000b61e9b13e849779be8f5378a670d61991875d8e091f359384d7be73d02d506930100000000000000426b2be4596a759a15028d84e08c5c56440e6cede68d088f47c671cc3387c3e6010000000000000070ba6e5985990ba1b1392713236f1b50df750f10f744cc6eb95fa7c5cfbc68760100000000000000d343862beda4cf485b4a3b7e9b62d3b7e6263b47f65a7c88c88f6e0f1350c7a501000000000000009fc0dde9a352d1ee6ec34287a06a99e80bcbe708469d795a8c29448bed6a6c45010000000000000054e3d0d93579bedb7759b60e4b5a009f93fc86ff8da59c00b06b318a4c8d95ea0100000000000000e511d441d6d3c822cb276bb2a14b1c8071d9fe1995802383fb5dcf8a92edcfc20100000000000000a15896b8bbf01f757f120813bc2e78b21388eea66db4b0dc2e1afeabd3d46dc00100000000000000be2235b9d9c9164f494dd688000fb569a37d5c47912ef99b9ebda9318d13345e01000000000000000139b946b46bee4c61be50c986f2a9ef2e76917644e2ecd842c59d61a94ee612010000000000000019a9d56ea35496122fc44fcb5c29d27fbb43520556d6f8d97753767aaa0f228e0100000000000000a8dbfc6cb88ac105e25b9dc7f11e883631824647cd4d0c18014bb6239627b2900100000000000000a5b094ae7c156592baa68ce18dab6368d5b665e9a0f07dfc5f54f58309e086c1010000000000000041ef4a31eb7dc1e01f4630604e1908e644d7cdee3f66a60f98d6d59605326f8b010000000000000097743d6364cdb6c4790cd37c4c2ab5fbc6c65e8bb606625e70a6ee04ed1650d9010000000000000008cc1d6c743da905511a39a6f0a68809a6bc32f8ac25e53bb2d6aca4f493fc9b0100000000000000acd71d4269b3ba2a9de822d494c4d841708e1519c08de41d7fc6153eaf48da810100000000000000d04d64a07f144638f20f081de122b88fed0cc8bda57e4810e7afb38036dd8bbf0100000000000000f26945a8a64032a1defa76e720a99649125b55751b6088205e7acab901de670b01000000000000005cba2c6f569da1edc3778308da406f266aa53140381dbb3f14f22909ba6e30040100000000000000dac2e90de824b109043f70818d53eabe05e79d518bda504e951d7f4056b0b2720100000000000000652f455eb3d30486151c716a4031bc02bd00254ef3e8290fd29f946d958a46b60100000000000000589fc35b132ef9d7ed9a6787a203e5a3a37f8cd6c775f47ac5e589d55d381a6401000000000000006f4855725ebb9eced957bae43ffa7d30657ce7d06b251ce20e2218bcf929e4050100000000000000749556da4a259bc1f0b8ea8e3726c2251656b92205c30b635ec9f42038f8defb01000000000000000ce4d93e25fa5302f4b059456f680047f87be428ae88579e0b862502b5ceed600100000000000000c1758f7cbffeb844419bc494a9dc65fb394259f01e9bf23789a75acc29d7d9620100000000000000c1c1ff5f66fefb5c0849e3b2333411d1f7e9dd4888600e334e7a33623f15fa360100000000000000fe240e80ff8a48a77947b394979cf361017cd906ddaab637d72cf72e729d79bf010000000000000006854c73f5703242d31d2576ac2297c93f0b5dc16ade0097c59d5dc0faa43c550100000000000000fa2c21f1a03638d4cb35202102240c2b85f5667924d5838cc503721117049da601000000000000008aabd4f6d7ecec7a749c83fc7be33f3b4818cca6f93a4927b4964900df9454e50100000000000000fcc0d954c7d519851e0094cd9a015b4789022a37091e3a04791d0731bd85f0d301000000000000003948bfd09bbbc2fe6ac5dfe53146e32df50828eecf7b2b18cdcff8dc385cbd750100000000000000a2a4af2a11ae7ba812fcc32845583d0354a0f2ffb1271a53c9a976a0f47fff44010000000000000058e304af91397247f704ce95d60845629aa59a50fba1c13896bb2300708db4720100000000000000070bae15860ce96e4a0cbdcc051c75e37a458c8e6c5ae59681d0ed938e588d4501000000000000003ec37919f9f43a9f85f539edfde3ceebea1b0e8279cb036641d588a9da81a6ad01000000000000005e48598ca89db19a4c279a251216d81e33f6b69e7d2ab4450968a1f9409df4a30100000000000000f510cb6c7032c9134dd3e50014ff6d391cfc91606d003fd4acd37e00f919d8350100000000000000cbd74a646a84b73518eadc73b1983dc9733839739576af9a98c698070a3a4b590100000000000000d2e72b0ab02a001b2e573c0d3b78404a7d3c600c3a9fd8ef38e823cad6ed3d6601000000000000003047f8f7e9c47fda9130ccd57d5dc8d407bd89b8dcf8ecbaccf00da184c73a570100000000000000024743c39cd9e151344dc23c65ee0346132d190a224b687be5c5ae31c5e7bb0a01000000000000004e3fb8c16ad624c1852777456805e5352d0221269de66949c95da4076206b35a01000000000000007ad55381f9de00220678c95a19489640fc61331e2a40d927e3d833555575c6fc0100000000000000485d1c94299c3b74c4a87aab7b7d8e2ec3256fce3bcdc0f33a4d2a196e4ee2b60100000000000000b98c920666586f392d129d480e78a965764ac82de45e691589b3aab7831a7f020100000000000000cb92ffeace78dbafe6fbf275741b4b38657fb81590712aa0bca7877931f6ad39010000000000000034a18d21097f479eecbe51b91c522a798582caafc787134bab6888854742406e010000000000000027791275ae7d4735aa45e70210663067f7d268aa57126a26044c8f6d8572a7d80100000000000000f7c9f4bc8669969246cfb748ac6996db6cd4c1fc634d981a1093b2c3d7a2eadf0100000000000000ba95f5d0e987305bb794dfeae69d7dd6a7987aa66cd7c9d42aca15e9160ec6a10100000000000000ffd82ddc49373448bed6feb0032744e20068f4e21adc4cb6d2cbf05ce73f4ce40100000000000000a9f24f0208a21e8cda4e450c72074f20d76a927bb80fa4418e480e0b59575c6b0100000000000000507b0289bfb2f55c7a62ec3c3298690909013c916dd5885b05b330fdc0caf127010000000000000016278af083f6d261762f8a97b6a09ff83e2f5927ce26c2e48f3c7e771dc7e6950100000000000000c49e3cd2c701bb845963c2870dcca12ed070c3f67ffc20144327a93aa6e896ec010000000000000081b1fce3ee9e31723f1023eaa9f8793e8663e72c50fbb0fbcea9bc78bacc491b01000000000000002dad5b2212ee688f2eeb9ca1fb6a90574f006dc1c6680ac3a8523363a248940b010000000000000067ccabbf18c035791cee9c748bea2ca03cf72c40f5ae786f297f84fb05973262010000000000000050f9fd6c0623020debb7843bcb832ee1d80db9b156d8e6083ccebd434fe979470100000000000000b8183b905f28b87c68c2d5b2f39f009f2ee22b47235f6c6d6cf6e63121b490300100000000000000b7c13f1239888cda5c8e6ac9ea10675df17633368906e66a487f91ddd3268ca601000000000000002cd51e09c3197e04155b78f3d97742ceffface390dc46f81f2613a94b2e483fd0100000000000000affb713ecdae328aa4436756f6a3e8add6b274d5ef1cc19d7aa69ab82c80e472010000000000000052912b3dfd0ccacd00586b97f1abe32431a2f6fa9c2b3bb17837a1ecde61728001000000000000008a2b50acd1a4955fc814bf6720c7427902a6ce709f3a2d7c17c55b67f6f1c06301000000000000003a511828c0cdc0fd257387843fdbf6f19d5ca1ef1c29ec7e971fc9f1195eb60c0100000000000000ee5605c1a9ed9484a70b8a591339830f24530eefc4599a7c6188a78896908e2c0100000000000000ad06042b85ed16ff4e46f5a68eba9ac12395366ab17c2da24b4f6747b2c8934f0100000000000000d1c146d2429a5a827660008721c7a880e71f44feaa3dc75524c1a9281bac48cd0100000000000000e4b2cffd0b9cacfc500050b27ecae3c55b9b51bd9a416d62605118c8ad4fb09f0100000000000000b28ba3f09e3521f7d09f0098c6743bc218ee2970068adfa5d908d9d06e627ae50100000000000000f6d74de7b39455519a5d6480c8f12c93fc7a4cfc9af39154fc60857a39ad888b0100000000000000c8be78d05f652edd0a64a5865455de36d0fadb0d91c470fd344f8de23c8a6b9c01000000000000002bb7b11dfe79a12110b0370510ef20d40ba8a563f517310f8bf37cf7f0403de40100000000000000f86e50733ff2142e88fe5b898087b4b1d6a3250064a439097f8995069624adef0100000000000000bba7a1ccb67a410afedb8e033ad69c39e7c554ce0ce6584b0e6688bae30f7d69010000000000000040533a786cd0be9618126633512666b1b1b9ab3b436fa653c93e2f65da9c196b0100000000000000be95095d93298171c6fb8a1847adfa173d127e13f53482dcb694f891d68f0c58010000000000000085b714accac0654ba57fac59b626dd35802269d2c1d995cea7c335cb05a88f7f01000000000000006a5f902cdeda2c2161d16bd21d586720c08c0bbb7b463d9c59147338d26a8a9601000000000000009c11e35911f023df6e4d218e53412ab4e4a20c17961d63ba381c913b51f394c001000000000000007448b6f6db7cfffd8650a1f3f08ddad1e114321ea770c9cfe6154882f586edb50100000000000000ffcca343512faeffe1cb3a8a7ce62fa4ee0c7f6a5f3e5ac883482846e132813d010000000000000037483029302a84623f0a8db165fbed905b0a4fc25e7cfb56e975a0e98336a59b0100000000000000ecc7b49598787520ef6336abaf798adbadd6406bb889d8bcefacbbc1a887a3fa010000000000000053b5918f72e73f92f32b578d1b602f0cc554d98bee8c4e131ef0ac7a63399fb4010000000000000063e935d23d285cec7b014cb7736d65b4acffc45ca589003d3231de8e6db8a8aa01000000000000006180a56305eff3231eebe895b44751f075f826684ef42a862f11e79c3e689cd301000000000000001935d43843c66ecf76a9f4c4229de9ed7c172f52aa53d1a279f2856a736661b80100000000000000068f2c90b93ba6130eb3a03f568411a471d0710086a468f8cba32b34e37411dd01000000000000001b08e8788191e92c357ebc21cac8b35558598fbf2f15a5f9a6bc6d980c2857670100000000000000c7d9cab0fb88dccd0cf4abbf5df9d7f36a3de439c5070c599d397e74133bdfed0100000000000000866fe4ae134938ccf4c5caf01358881c75cfde473b0bb8a2623cc231db2ea3b901000000000000005d202a011f023dfaa6713f16bfd4409dde8bfe594abd59e2be32484c73b97982010000000000000008cb5d0ff7f138698c9fb80a1383155cff65ec7e127c5b3614e2e17963969f100100000000000000fc555c014d927fe7838e840609916b9af5d93892ce6f394398858286802b8c6101000000000000006727561447ed474ff4e15645b952a37fa5008d4e694d4853bb55594fa34c4f340100000000000000af9c4c3cf1a3581ee22c9d1a648bfe92fe6d3a7ae39410f213ef25ce6daecffe0100000000000000ec295fb809e22c332aa36a57afe05f2c093b2d13e52b0971d8265c5514e4e9690100000000000000efb5f1e4c4ba37f8c159d452d897c607a58518b8355a8454620b3e3ccc3271230100000000000000099a9eb71f9cb1b7d15eae384790b4ec35045a19acea1730ba62f3e7caf31e8b0100000000000000d34560b879f8f4dd8d2fbd4f6d51b9b6f41b76656860646fcef4e1498859a19001000000000000008c3dbd5a1b928cb51e918452191e5328b0f6e8de0259517831a90b02dba3e6110100000000000000aa6fd06015b8309ea9103f4b0e29bfa7e21ab5bb1431c3a76433f591c739f8380100000000000000a892342c56149812a43e98c82b6a3dfee7eff384d9b6d832002ea63838f64900010000000000000081bbaa3313b09e3b0ea2817c3e968a33587ec8928539c3f3a6d0e65644612f49010000000000000023f07bcb8dade90cefd08732183d5fe32b89ad8a4f84987b9e4e7e767c2587560100000000000000c13b603b5fe774d98e59c26fac03f8096ccc42c57d0cbc6a443b4f07a3c077920100000000000000be6b59cb464fadec4e0b22a9f12857ba5cf7a14c4f9551439d36305d582dd7fb0100000000000000f916634f9fd7e54374e30ac6b722ad1793c13cb2d5f2ad38769eaca2f79d414b01000000000000007ba967a2dae0d8839cf44710591db994d18e53b25ec6d0f861da0037c4a4366a0100000000000000222ee6c6a6c62d56cadb4eaad5104d595fe962fbbdd551c81562d3b509212907010000000000000055ca63358082034ddaf76b75f41a396081dd4f39a61eff13f7575e506e10335601000000000000000aadf1b2009026f8f5dd75d532e91dc756fd47572aa0f3c15d26790e6d6b2f270100000000000000d0a196fdff4cbca9c7d8a893f9ed66d86038378d8faa1fd8543fcce60ff1cd8c0100000000000000d0b4aada93fb3d0b358e8d59f8914f5987acbc6f5b4f3e12a1ed8d962eded8270100000000000000941547f54cc3f578cd00bb09f03cc5a6d3684fc1e5279f8148b625d993dbf06f01000000000000004f950be5bf61958a0ae6e6a036b85b33ba838de8bd5508b558cbe2602d341168010000000000000082e6b6bf1f275c59fbde0dad91393ae690d5e644d11d23898a9ccfdda025920a010000000000000074b60dfb12745236ba9dc8f925efa21482b50c870c567638ba3240a05fe363d90100000000000000d761043f405069ac01285f1ff258450aac675f08d906b1ae0a1ce54eabcb36d901000000000000000dfbc1b5757e1f0ba348f8af64fb631aaff86cd21fa0529e0bb1fbab250879260100000000000000b770208e14dc236c373cad93e19b092e9c6c7a90604d941c19ca19923d33013f0100000000000000de74612da9080d47be35bf4ded2094e23c1de14477114ddcd7b76b815456ec0c0100000000000000d3b3d9703a265a51a137b9de348587c645a168981ef3e01c9dc482856751b8ef010000000000000003dd543dddd6ad00137ddf94a218bfa19d2f08b4365d696765dc25deef76598b0100000000000000cfb9f7f1fcf903a51af729ed1647aee928630e148990309f9dc9f3b14b114b760100000000000000a2ee8d9c22eba97998d63854409d99c87b21d079f5c888d863a81d41d6abf0110100000000000000d14a779884de1b2fbf079b8e47e8c0edb1c29e282996899a4eab5aaf1f4f41130100000000000000c2344c6fb787621295335b6b5acbab9531199901492d41e13a64dfb2927f83be01000000000000002ba5634557f15c4e9198d1ce0cc525e897d3fdecb0c18af8a53fe4e3384f4a1d0100000000000000fd9edd1de37e1788a07c1563d30ce7929cadd7684c279764e2126cc1477d4bb30100000000000000a70aece9abab1251e65fda7a67d7709c2c5ddb7a253c8a83f146c03732469bd101000000000000001ec0811cbe4f2ea1e5a714d3ba08c6d7fdec138bcc6406da3c6cd32f1686616d01000000000000005208fe27477acbc6750d0caa831c0b26801c58eca046a6cf9d4143f85d877e8301000000000000005667d5ab2b7b56ad406d51dc657f573e65bc1fa542fc3ff43793a487af92aab601000000000000005cd3c5512d1bdedb73e633eb63f71e7f0bfadfb6990de4c8d2b2de1d2195df1e010000000000000021a0865e3e99965f51edf95012ffd7d6ea460956c5ba029cdf1c8820376e51c8010000000000000025ebbb2a00126545bbedf00318a78b6e61a0b52c81e30231ff45bd32e311472f0100000000000000726e7a352b2e7451af1998888180bdf7954e7849230d99bc86b4df51bef4399501000000000000007bbd4f800c34110b6c739ff1e8913a36ab62f25641c4bb7413cd354894b602930100000000000000500a9e1ea37636c24ebf4e32668897dae936eef42b6da49027f606d4f24a7e96010000000000000055d7ad9e836af36e9553c49dbd25d703db296fe5f60099918a12bd1abaa2f7830100000000000000ddac76c2a61c9aef4a9b3247aa0953187533f346466f02840235662440d2945c0100000000000000055c25dcc9cf8a08ad007ed9c8afb0ba53cebd129a20f194d272535ca9fa064901000000000000001e1fe4a3c9f590aff5a70b9cae569605ac78531cc10d310436fe0c306cf2e36101000000000000008ad2a4c25ba87cadf77dccde3a56ac8387fb01a6e84d2dac43927f163e7ca0bf01000000000000004df6e4d7da2c11ddb9153c714699f9ab625bbcd5e8e38f1cdeee567dc04abc610100000000000000982d9e3cc8ef3f8d99638b6f9df32c82356e1cd88f123d1e586a604d1d4b0cb401000000000000009cfeed14dd2f96550a0e7edebd9c9a8c8b1d8f7efdd1abca01987654239f3c860100000000000000736925c31654df870fbc29437c9b2a488ac3262e5d80798534ad00c43a61e5470100000000000000572538d1aaea11c9979bf074e0723ba0228690aa9ee8aa0b81db32aabfd822de01000000000000004c3b4b0a3acf902acec7f5d868f77d78b17fa4cfc5f785d393c9f3d15e04880501000000000000008404cabeb0674765bb77af690fa838ba28fa2045d602994a89f07680f4851c83010000000000000006b9e740c0a0e1f8fd31717438d5918ed8680eaccb70fdc9511931ce0d164ae50100000000000000b8cf76a8082d518016ea5588be57b64e156ed23b0f72248975522c23d15ef16101000000000000002565e04c6e0b665fac87f8238bee74837f8f621ed63409f3838d263603400a980100000000000000373b26b330a41547971874dd81c2cbbf8b7e3eda05b861c57205ad7e8c15bbcf01000000000000002a38a4dcdffc571d547ee3e59121fdd378335df7c65877f983f0957cdc9824130100000000000000620c78305072857b43dadced80ebc057dbfc82b58c14c7b63372ef02140867650100000000000000546ce2099b3863d2d75324d5866bfd5324d8ee4701a99dd53528f8a8c898ca4801000000000000004dc2e72680dbf0156818114fa34d3591f8e6948df25a128e191190c66f6ac35301000000000000005d50d6099c7c88f367568fa473b44785acccd030251627cb371de16e5fa704260100000000000000811038f59afeb084566271eb138b0106a8ca013f57e589d6f777bc7bb2219e760100000000000000f5e2c973d4ccbdd36d8ed4e3dae75d3b50002cc1c74eb0a1fe29ef1ef8e3f0cc0100000000000000258f23d60623fcb1d699a35f79776a9e81e979150ba5098dcc8e3a69a407ff9a0100000000000000b1f748c87b12edf7242b4719cfe68e6761acaa4329beee538d6ff740941d3cd301000000000000008b35aa0d212e4032ede352d5426696c260c9ecffa632a2e14e6a6629a6c9f637010000000000000072341ca1eb3a0fd4e790318b51ace114315573d5355c9d5336e39382ba0642560100000000000000a79cd2241bd68004641baac25c1900da3a9e6d83101aea3ef2a58d78c657272f0100000000000000b14911cb101f45b88c437a36bd82a5f8641b1c55052060ea46ea2baea570e8bf0100000000000000b66e24ea84d5e02a7b2b58e20bbf17a0f2a19c4654bf8b07669ba3b9fc4a468101000000000000003c1dcee818434058b7de26ee874ade21bd1149185d6dcba1f67048b931ec3dda01000000000000009d31c78ebe9664e2bd8ba41cddcd9c5b9fb0cc6f8be0a2e5b91f6bcf66a5c7530100000000000000290be52ae5259f3e8bd0cdf454004607867a97c1db86d0c9ff16c8c83625bc830100000000000000c91199db47b7591bf1a928534cdbd3e5979a0d09d6a464f2a9607ec444bd8a9701000000000000000428e3ccdba17d779ffba05c9ec7a6264187d13bf89b6009e97200474ad3439701000000000000004c43a374e6b3e6f7d6c5a6b8518ae0d0d232a1c46d63af8fbc800045a14cbe930100000000000000c34f62968a87b2e4a9340a75004029dff5777a020f60fb287f08038491881f220100000000000000f54bb82d58c665ce3289b8765c40e60d84f74da663c164c38e16784d5c142b2c01000000000000004d9b0bbfc6a294ee0492bdc595a5d8f7cf371c729c5c319a3822f0248bb4fef70100000000000000bbff79a9b92ef586f0be053cc01639b9a335ad8e2910146d070997e285007d830100000000000000ccc84b255e5e73b971f2e71d1903b5ef9bd6d0965ff3ce29c517c875bd7ab65701000000000000001babed13d56d28fdb937b07bce846689584099575382c273f7e425f822c8159f0100000000000000bdee8597e248688fddc627ad9c95cbebf7d3b5f248b9a742aa2d8e761fa365050100000000000000a128a73c5eaa1803618a75bc368c38e4c5cd40999cb72d615b8af1d30cb8cf1d010000000000000020270811c3dc453f37b27d958ef7ad7dd4c7f217c83f94bd0ecd84c60018a86601000000000000001887f7937a8ca4ec67ceaedebfad3d307b10f416219de1ed4f8646409eab730a0100000000000000d64083c00178b8dd224afade9792fed8076031bdfe9efc5b8128e6372a9261e201000000000000001c6842f07fb07b318a8d00ce6258844374f8e894853ae5fd4a85c867d3fc32e30100000000000000417e120dbfd0297d59458b48407b62570987f1e907dd6dfa9a20bfe64eb489d8010000000000000042f20843bf75f4916ade8eb2faad0ada3795b3cacd29b679f18805f2826367550100000000000000be724139e9bdd099b70f7edab7d1acf0d05fa1a4ca212f5e2958d31f4272dcda0100000000000000ee40b85aa515fdbe6e559f815edc7ec1e321e0d152dd54258382ba31b54e447a0100000000000000134cf4720486824c6a27fa7892c8d82e805653ba1d98480267ec284a76b792c20100000000000000c3150e4ca47e7bc6486f198bf0a742a18ab0871bb1efa34e82c4ce81f27926670100000000000000c2eb94269c5e5d2ab9a1a300387358679640763b053aca99ba5c1c9083ee717f0100000000000000316bafdefb60951da2738d6c9c2ef1866d139b34b5eab6944d6bae754dd3fb110100000000000000b65475766e6229c87ff34263f5ca58525ab133962bc599ca0eab096ff296f4e60100000000000000ebb1834a568ea7653bc66f394937a0aa4f2f617118d2161e2c11c0d7d2febb9d0100000000000000b6d7ac98d6667fe8f4a186ef12a66b017df05a54e11b45d3f2967cb3d6b6827f010000000000000042f47dad5949be7b7b8f81faaec17b1b53465b01b9f8f81e6a45f2fc74e12daf01000000000000007a1291795805dbe300425311ae50ed698450b1912b62e5b5a3264c68bfa970760100000000000000e0df5b2f299314d2d419b46d15c3c8a739182d91c3d4b98cd16c013c3a25c04b01000000000000000150276c1b3d28d42630801c1d4a738ae723887d9286e40ba48d10b0752f7dcc010000000000000098a6defcfeb3dfca36ec46eb373734627a2c395cdd2d886046a11788ed6467af0100000000000000853ba986f8785e8fc1a2ae2fb86f17cc91886d931182ccb8d148379a35cbf02701000000000000009bbc024bfe4f072b94735afda064dc3c7da2b4bc0c50cfad44722543583a372e01000000000000002b71a8a81bc2be65f3224ba3711d1bb243446d154369e209f97d8375b5fe8deb0100000000000000496826b538d97906e14d417b48598d7d591a483ab5f4c6786cd0b96239c2f4cf0100000000000000ef27d1d5573e6419ffcc7c4372668105118256b810ab2e2dbb5e7d8280ee94250100000000000000c7009be830fe78c42f12f0753923131d16300bac230650001636b6a546cf0aa30100000000000000ed3f97f83ee7799c4aeba9f40bd18134c862c1a30875fc1e038cd27bae3a739a0100000000000000348e8bacc2d40191a6a00e137c745a422ff8fb03148d2ff9cad75efbb7a670140100000000000000efb31c5039e45fda750af5d2ea31b3210a407b168adec8f98db1f3dbc4cd943801000000000000003afc780f5d6cf676fbafe8bc742aa01b64d7d12530ebe1aab2db123a23f439b00100000000000000bff74b6ff5ccdce9a659408871d486511938422a6e550fe0669ccd739f80108101000000000000009ac13f915431b39f99d8c0bed7e9c62d22e1e8b6daaee809920f491154ef6f8b01000000000000002ff9330a8c344ad3adf4d97db014a2d0891d4dd69f5c8369dad3e0b25566173e01000000000000008f44b6746d8d809da87915d6ec208a07ee63481d24b275c6424429e16ff4d25e0100000000000000e01d6eda8094e949bfbb05c819b509a12eb662a414b822f841d9555d58e1ce7601000000000000001262625cc59c0e4b7548904c31a02231a601305881a231d4dea45eec6cbbbdcc0100000000000000c3576342cbf99792896ee5329b04ff2eee2fc2bb6d53c5c03d52c8957ee793fb01000000000000006ad4bc289673029ab44f3045eb6fdd3589d05e0e5fd76ee017f650a662f898fb0100000000000000a82f563264d1892dd46873205d03c098d8b03f53e21c797839737e4e5f66a87e010000000000000059dadf17dc0f84c1c334e6a815a04bdfcd0988a3f3bcb713c66ae29e17276cc60100000000000000297dc7cf28b3d40a42c5e8faac876bf7227c670e6e031dd0e0537f4fb70e6fbe010000000000000043601ae31cf5b03cb49395dda13809f7398d8670ee4d2172b14a1ab05986ac3b01000000000000000909c1eff97923f6bd47e6ec8b5dc163b32d5b675a3b13138d3599e5cc77ab9f0100000000000000a5f788e86ee2d311357b7aa4a128f063fa4ee36958baf10304c10bde7421aa2c0100000000000000290321d793b7dcb12ad148c2438bb60821bd938b7e9164a0c3d0fc82987f8b6301000000000000002ef11bc5ce1e7b53f788ba01ba581b9171ef36449719ff3eb20973342a4a82850100000000000000e3a73e5e042574299206b6520770553482e099d075bf00cbeb139b5f6737afed01000000000000003bb30832d06cdd3e081afef0cf2b7770bfe81dc58081d1886443e4e4547da8a101000000000000002832b59000d2027d2bf57fdb40da04bd8aac1498923397517181cc487a92815201000000000000000cd7067f96a2d63fa72065302432f48690485fa5f47c9afab17123e0482785230100000000000000f6f23ae9bb4c269a5959d51f9173270ddefcc354b63de77b672bce58cabe60c8010000000000000073dce1727ec50c50366378cd389246e19543d900d7e9dab8e323d04cf5b202a701000000000000002ada479e1fde7211de15900ed29035f6f07506cdbadc4c232aab96d62006b9de0100000000000000ee1a56541083b083f1a13b5f8aa4042a098de2cec4c43f3250baaba8f03a52ea010000000000000062a91ffda8611ffce3edeb628ea6d3b8b12e5b2448beda6da8334e77a9ecbdd701000000000000005246164c02e9e6bfb7a2dbf7ba8a5440a189f8048373678f5b1085f217464c050100000000000000dea69c3badff9b8d7571cb6c538cd099544da7460a19e1b8651c5c530a6dd53c01000000000000001889f1b031fa7d64c4b480a17cd2941be2c02681bca397c93607091f37bf5ee1010000000000000005062bede97a45c6e1c6b593675ee07ce969fae45136cc2b2afc6e705a77f4700100000000000000dc6e03f650e4304ca8d1598dde8d4faf45891987bfc49ef785ace47c4c0b557301000000000000002d12330b8029ef13e02675c6df0e10c6fdbc10e974803730866e603305ff4471010000000000000018ede59e820bcdd0ed2faf99a21bdc916d71577dd35117f90efe77b8513e631001000000000000008c258b4ca16dfb8e5afde4cf40fecf115307798117b4860475511b3b5d5615840100000000000000309bf143989c9effebb5cf0ad8b5cd8ea1c8db104500606280ae90a93d6abc2e01000000000000000e7bc96895730726225e47e31c742fd44d3936f31ecd32658c694fc11df2522401000000000000006375ae0c1bf2b0388e16971715fd68c31ed179f38947531c165f0da2c3fe76670100000000000000e7931a825260ba7d4fdb5f4990d39a71e2a8b215a776ebf770102ca772f103a3010000000000000095fde7b91441fae9d2a6360d30228392519293be5e78cf3305667595cb15e566010000000000000047ede3eca5f6c8f0a51f2d36d7d1c236aab07a8b2aaa6ab08c8ccf8d87ce3dd10100000000000000a5d172126aadfe80d2b711776674d61df5a1cd1a0129761fb2d2de58ed9d48a001000000000000001bbc459bd14434c8b961d3c4108986f28e50a33c825b0cbee11b22a60b90a6d30100000000000000e7eb7de26e0e24fd528fbbcecf837f26579784dfd4db512c9237e2811139738701000000000000009f677785cfbf44140bdf38770f3d8076f222aa1c9997842d89d580b0f256198f01000000000000009a0ea02dca493accceb975732f31c9d249d4c90ff1ca0bd86cbe00f1728146b401000000000000003adbd2d5abdb70ef56c2d8bd4a7c0d67882a1c2050a856937491e98496a496fe0100000000000000f7b6a82ff22dd13d5665015a8abec429d244f857d3d6dc78e3f3c65496e4a99f01000000000000002b07c366c1ed899a2ac9722b76e092828714a8177368e51ca05ec05c565866b301000000000000008e3d1c8c0261e193e87403c8959919ef035ba39175d3ba22f31190303601412e010000000000000094416582fe359e0a310da59bf93df8ff9665b89071d4977a9a9f3390b75c0c450100000000000000ff568b8e0dbe74604c6d04b5de6f2df03b343bea074c4495c6a10e511ba473d90100000000000000a7254986c00f94b1ced526583ce2ffc0e853afd27a8e90cd57178a328e633866010000000000000032bbff551f7ed51452d264d796315e578d982e942eebb60e519ca648935d8b0c01000000000000003a4bfd825ccd308def4a61bac80c579db42b02ea5f1a0768656a326e83a0dd880100000000000000d2f1b3b5f7eb1b0d8328911d9ec920327d7a30729e80c1238f86dfe27c4fa3470100000000000000068f911f5ffd2e94be67762e2eb02e792b79ac8983720f40615e27ad203e03c50100000000000000841584e602ab975c936fe7c2025fcea2b5a0061e839b1ad96528942b33d0974b0100000000000000f33b53556f28f27d250585317cd57a18f37c5d5f2b3c1bd00a0c91ea54f1636f0100000000000000bcc6391e5ad7e8e51ab7cf27eb77d7a631428fd973ca532bd6756dc67acdc49e0100000000000000e056900cabddb471de9e1846d7efdddd8b5ad400b02fc54b4402ba725c78bf9a010000000000000006e45b1345e00445a4ed84345b8bb15ad011fe5b23fd8f074d8d3e332bd505950100000000000000232b04be856e808b2616319b11eec858097a8afee5c18f0af0e1c33f1c6973ad01000000000000001a02012d8a476cc43998b10fd5c8f5174ba2a2eedebf27fab9831c0d812b0528010000000000000098763eb72b3f7dbb7a793bd1d4367af5f072ff45a1a6eae0e002e1eaa24c5d55010000000000000079f73931b31ce353119fb4063412e844b16cb3eb92e592ebd822a8c21303554801000000000000002929dacc53614cea1848e7ba20fdeed7cb0bd81571aa72dfb63dfc84d3965d2b010000000000000030afa9ef79458f844a27a3881655b6eafb90b3912737f1bcddb95e78eb098c1d010000000000000031a46e639e57d1a11119b17f76617a35b3606d206fb5c3e87710f464f7a57de50100000000000000ed25d7114e2aef2f0e57dc2be1401a4994d8aaafb30223162634a512604a2366010000000000000038070000000000000001e7c32b0100e11c00000000000000002904050001000000000000002a0d050002000000000000002f16050003000000000000008e1f05000400000000000000ee28050005000000000000004d32050006000000000000009d3b05000700000000000000fd44050008000000000000005c4e05000900000000000000b75705000a00000000000000176105000b00000000000000766a05000c00000000000000d67305000d00000000000000357d05000e00000000000000958605000f00000000000000f58f0500100000000000000055990500110000000000000095a205001200000000000000d8ab050013000000000000000db50500140000000000000024da05001500000000000000aaec05001600000000000000f4f5050017000000000000003bff050018000000000000008b0806001900000000000000992406001a00000000000000f92d06001b000000000000000d4a06001c00000000000000685306001d00000000000000b65c06001e00000000000000f76506001f00000000000000308b060020000000000000007b940600210000000000000025a70600220000000000000033c3060023000000000000007fcc06002400000000000000c3d50600250000000000000011df060026000000000000005ae806002700000000000000a0f106002800000000000000410407002900000000000000880d07002a000000000000001b3c07002b00000000000000764507002c00000000000000357407002d00000000000000239907002e000000000000006fa207002f00000000000000c3ab070030000000000000006abe07003100000000000000bdc7070032000000000000000fd107003300000000000000b2e3070034000000000000000aed07003500000000000000971b080036000000000000009d24080037000000000000009c4008003800000000000000255308003900000000000000735c08003a000000000000000c6f08003b00000000000000048b08003c00000000000000589408003d00000000000000d3c208003e00000000000000e4de08003f000000000000003fe808004000000000000000f7fa08004100000000000000aa0d09004200000000000000153309004300000000000000fc6a090044000000000000003e74090045000000000000009a7d0900460000000000000000a30900470000000000000014db0900480000000000000020130a004900000000000000791c0a004a00000000000000364b0a004b0000000000000043830a004c00000000000000e5950a004d0000000000000045bb0a004e0000000000000059f30a004f000000000000000e060b005000000000000000812b0b005100000000000000dc340b005200000000000000ef500b005300000000000000a3630b005400000000000000b69b0b005500000000000000c7d30b005600000000000000dd0b0c005700000000000000f3430c005800000000000000087c0c00590000000000000052b30c005a0000000000000060eb0c005b00000000000000baf40c005c0000000000000072230d005d00000000000000805b0d005e000000000000007e930d005f000000000000007ccb0d00600000000000000076030e006100000000000000793b0e00620000000000000088730e00630000000000000092ab0e00640000000000000083e30e006500000000000000731b0f00660000000000000079530f006700000000000000748b0f0068000000000000001fc30f006900000000000000d0fa0f006a00000000000000633210006b00000000000000826a10006c0000000000000028a210006d0000000000000005b310006e0000000000000055d810006f000000000000004810110070000000000000006548110071000000000000008e8011007200000000000000bfb811007300000000000000bbf011007400000000000000e828120075000000000000001561120076000000000000003b991200770000000000000058d112007800000000000000770913007900000000000000944113007a00000000000000c07913007b00000000000000e7b113007c000000000000000cea13007d0000000000000067f313007e00000000000000d31814007f000000000000002e22140080000000000000008c2b14008100000000000000545a14008200000000000000ad63140083000000000000000e89140084000000000000006892140085000000000000008dca14008600000000000000b00215008700000000000000d03a15008800000000000000f3721500890000000000000015ab15008a000000000000003be315008b000000000000005d1b16008c00000000000000855316008d00000000000000b18b16008e00000000000000d3c316008f00000000000000e9fb16009000000000000000073417009100000000000000bf4617009200000000000000286c1700930000000000000029a41700940000000000000041dc17009500000000000000591418009600000000000000bf3918009700000000000000704c18009800000000000000948418009900000000000000f28d18009a00000000000000bcbc18009b00000000000000e4f418009c000000000000000b2d19009d000000000000002c6519009e00000000000000896e19009f00000000000000519d1900a00000000000000075d51900a100000000000000920d1a00a200000000000000ec161a00a300000000000000b6451a00a400000000000000887d1a00a50000000000000077b51a00a600000000000000cdbe1a00a70000000000000070ed1a00a80000000000000083091b00a9000000000000004e251b00aa00000000000000fe371b00ab00000000000000065d1b00ac000000000000005f661b00ad00000000000000bd6f1b00ae00000000000000de941b00af00000000000000fecc1b00b0000000000000001f041c00b1000000000000000c321c00b2000000000000002f3b1c00b3000000000000002e721c00b4000000000000000ca01c00b50000000000000044a91c00b60000000000000022e11c00b70000000000000044191d00b8000000000000000c481d00b9000000000000006b511d00ba000000000000008b891d00bb00000000000000a5c11d00bc0000000000000053f91d00bd00000000000000ff301e00be00000000000000054d1e00bf0000000000000002691e00c000000000000000d1a01e00c100000000000000c5d81e00c200000000000000cf101f00c30000000000000083481f00c400000000000000af801f00c500000000000000d0b81f00c600000000000000f0f01f00c7000000000000001b292000c80000000000000039612000c90000000000000054992000ca000000000000004fd12000cb000000000000004c092100cc00000000000000031c2100cd000000000000006d412100ce00000000000000cc4a2100cf0000000000000098792100d000000000000000c4b12100d100000000000000eee92100d20000000000000011222200d300000000000000325a2200d40000000000000055922200d50000000000000075ca2200d6000000000000008f022300d700000000000000b13a2300d800000000000000cd722300d90000000000000078852300da00000000000000ce8e2300db00000000000000bdaa2300dc00000000000000abe22300dd0000000000000012112400de00000000000000501a2400df0000000000000045512400e000000000000000a1882400e1000000000000005fc02400e20000000000000013f82400e30000000000000007302500e40000000000000013682500e500000000000000c37a2500e600000000000000a8962500e700000000000000fb9f2500e80000000000000000d82500e90000000000000019102600ea000000000000002b482600eb0000000000000028802600ec000000000000002eb82600ed0000000000000044d42600ee0000000000000058f02600ef00000000000000b3f92600f00000000000000065282700f10000000000000057602700f20000000000000064982700f3000000000000008dd02700f400000000000000a7ec2700f500000000000000b9082800f600000000000000e0402800f700000000000000f6782800f80000000000000019b12800f90000000000000040e92800fa000000000000006c212900fb00000000000000a0592900fc00000000000000107f2900fd00000000000000bc912900fe00000000000000eac92900ff00000000000000fd012a000001000000000000ff1d2a0001010000000000000c3a2a0002010000000000002b722a00030100000000000005aa2a000401000000000000fce12a0005010000000000004ceb2a000601000000000000e0fd2a000701000000000000c3192b000801000000000000be512b0009010000000000000a772b000a01000000000000ae892b000b01000000000000b0a52b000c01000000000000abc12b000d010000000000009bf92b000e0100000000000093312c000f0100000000000087692c00100100000000000075a12c00110100000000000074d92c00120100000000000089112d00130100000000000099492d001401000000000000b0812d001501000000000000c3b92d001601000000000000d1f12d001701000000000000d6292e001801000000000000e9612e001901000000000000ea992e001a01000000000000efd12e001b01000000000000f8092f001c01000000000000f0412f001d01000000000000e9792f001e0100000000000036832f001f01000000000000b2b12f002001000000000000a9cd2f00210100000000000094e92f0022010000000000007121300023010000000000003b5930002401000000000000089130002501000000000000599a30002601000000000000f6c830002701000000000000e30031002801000000000000c03831002901000000000000a17031002a01000000000000f27931002b010000000000007fa831002c010000000000005de031002d01000000000000aae931002e01000000000000441832002f01000000000000295032003001000000000000fe8732003101000000000000aa9a3200320100000000000010c0320033010000000000003af8320034010000000000005f303300350100000000000059683300360100000000000078a0330037010000000000009bd833003801000000000000cb1034003901000000000000f44834003a010000000000001c8134003b0100000000000044b934003c0100000000000055f134003d010000000000009dfa34003e01000000000000302935003f01000000000000c6573500400100000000000023613500410100000000000053993500420100000000000080d135004301000000000000560036004401000000000000b10936004501000000000000ce4136004601000000000000037a3600470100000000000031b2360048010000000000005fea360049010000000000007b2237004a01000000000000995a37004b01000000000000f56337004c01000000000000c69237004d01000000000000feca37004e01000000000000340338004f01000000000000683b380050010000000000009e7338005101000000000000c9ab38005201000000000000dcc7380053010000000000003cd138005401000000000000f8e338005501000000000000b0f6380056010000000000001c1c390057010000000000007a2539005801000000000000da2e39005901000000000000525439005a01000000000000878c39005b01000000000000bbc439005c01000000000000f3fc39005d0100000000000028353a005e010000000000005f6d3a005f0100000000000098a53a006001000000000000cedd3a0061010000000000000c163b006201000000000000404e3b00630100000000000019853b006401000000000000608e3b006501000000000000b8973b0066010000000000000fa13b006701000000000000a7b33b006801000000000000fabc3b00690100000000000049c63b006a010000000000009ccf3b006b01000000000000eed83b006c01000000000000c1f43b006d0100000000000014fe3b006e0100000000000066073c006f01000000000000b7103c0070010000000000009e2c3c007101000000000000ee353c00720100000000000094483c007301000000000000e0513c0074010000000000007c643c0075010000000000001d773c0076010000000000004b9c3c00770100000000000010d43c007801000000000000d80b3d0079010000000000001a153d007a0100000000000053433d007b01000000000000ea553d007c01000000000000225f3d007d0100000000000072683d007e01000000000000b4713d007f01000000000000fb7a3d0080010000000000007a8d3d008101000000000000b8963d00820100000000000006a03d00830100000000000088b23d008401000000000000c8bb3d0085010000000000000bc53d0086010000000000001dea3d008701000000000000e9053e008801000000000000b5213e0089010000000000003b343e008a01000000000000843d3e008b010000000000005e593e008c010000000000001f913e008d0100000000000065c83e008e010000000000006bed3e008f01000000000000a9f63e009001000000000000f6ff3e009101000000000000c1373f0092010000000000005c4a3f0093010000000000003b663f009401000000000000856f3f009501000000000000cf783f0096010000000000003ea73f009701000000000000ccde3f0098010000000000008516400099010000000000001e2940009a010000000000006e4e40009b01000000000000c35740009c010000000000009b8640009d01000000000000cebe40009e0100000000000001f740009f01000000000000372f4100a00100000000000097384100a10100000000000070674100a201000000000000a99f4100a30100000000000065b24100a401000000000000ddd74100a50100000000000096ea4100a6010000000000000b104200a70100000000000044484200a8010000000000009c514200a9010000000000003b804200aa0100000000000051b84200ab010000000000006fd44200ac010000000000005ef04200ad01000000000000b9f94200ae010000000000006a284300af0100000000000078604300b00100000000000077984300b101000000000000abd04300b20100000000000064e34300b30100000000000072ff4300b401000000000000d2084400b50100000000000008414400b6010000000000002e794400b7010000000000005eb14400b8010000000000007de94400b9010000000000009e214500ba010000000000005d344500bb01000000000000d0594500bc0100000000000006924500bd010000000000001aca4500be010000000000004a024600bf01000000000000603a4600c00100000000000084724600c101000000000000abaa4600c20100000000000047bd4600c3010000000000009ec64600c401000000000000a0e24600c5010000000000005df54600c601000000000000bf1a4700c701000000000000d1524700c8010000000000007f814700c901000000000000dd8a4700ca0100000000000039944700cb01000000000000f2c24700cc0100000000000010fb4700cd01000000000000d5294800ce010000000000002c334800cf01000000000000f9614800d001000000000000596b4800d10100000000000078874800d2010000000000008da34800d301000000000000aadb4800d401000000000000c6134900d501000000000000eb4b4900d601000000000000e7834900d701000000000000f9bb4900d801000000000000b6ce4900d9010000000000001bf44900da010000000000004a2c4a00db0100000000000066644a00dc010000000000002f7d4a00dd0100000000000019994a00de01000000000000c0ab4a00df01000000000000aec74a00e001000000000000fed04a00e101000000000000bbff4a00e20100000000000019094b00e301000000000000902e4b00e40100000000000041414b00e50100000000000010704b00e6010000000000006e794b00e7010000000000002b8c4b00e80100000000000094b14b00e901000000000000a4e94b00ea01000000000000d4214c00eb01000000000000d7594c00ec01000000000000e8914c00ed0100000000000004ae4c00ee01000000000000ebc94c00ef0100000000000014024d00f001000000000000fe394d00f1010000000000000a724d00f201000000000000667b4d00f30100000000000013aa4d00f40100000000000031c64d00f50100000000000037e24d00f6010000000000004afe4d00f7010000000000002c1a4e00f801000000000000ea2c4e00f90100000000000049364e00fa010000000000004e524e00fb01000000000000628a4e00fc0100000000000079a64e00fd010000000000001ab94e00fe0100000000000079c24e00ff0100000000000094de4e000002000000000000aafa4e00010200000000000059324f00020200000000000004654f000302000000000000ff764f0004020000000000000d804f0005020000000000007e924f000602000000000000c29b4f000702000000000000f4d34f000802000000000000160c50000902000000000000504450000a02000000000000877c50000b02000000000000b6b450000c02000000000000e7ec50000d0200000000000046f650000e02000000000000b61b51000f020000000000001625510010020000000000004f5d510011020000000000000f7051001202000000000000889551001302000000000000b5cd5100140200000000000014d751001502000000000000e605520016020000000000001f3e5200170200000000000053765200180200000000000089ae52001902000000000000e8b752001a02000000000000b7e652001b0200000000000074f952001c02000000000000e81e53001d020000000000001a5753001e02000000000000558f53001f020000000000008ac753002002000000000000b9ff53002102000000000000f13754002202000000000000277054002302000000000000418c54002402000000000000d1a354002502000000000000d9c8540026020000000000007edb54002702000000000000b81355002802000000000000e34b55002902000000000000c58355002a02000000000000d6bb55002b0200000000000007f455002c02000000000000c30656002d020000000000002c2c56002e020000000000005d6456002f020000000000008f9c56003002000000000000c9d456003102000000000000070d570032020000000000004345570033020000000000007a7d570034020000000000007d99570035020000000000009ab557003602000000000000b4ed57003702000000000000f225580038020000000000002f5e580039020000000000006b9658003a02000000000000a6ce58003b02000000000000e30659003c02000000000000183f59003d02000000000000517759003e02000000000000ad8059003f020000000000008baf59004002000000000000e9b859004102000000000000c5e75900420200000000000002205a0043020000000000003f585a0044020000000000007c905a004502000000000000bcc85a004602000000000000f1005b004702000000000000111d5b00480200000000000030395b0049020000000000006f715b004a02000000000000aca95b004b02000000000000e9e15b004c02000000000000251a5c004d0200000000000060525c004e020000000000009f8a5c004f02000000000000dbc25c00500200000000000019fb5c00510200000000000058335d005202000000000000956b5d005302000000000000c7a35d005402000000000000f7db5d00550200000000000031145e0056020000000000006f4c5e005702000000000000a7845e005802000000000000e0bc5e0059020000000000003fc65e005a020000000000001cf55e005b02000000000000582d5f005c0200000000000093655f005d02000000000000cf9d5f005e0200000000000005d65f005f02000000000000440e600060020000000000008346600061020000000000006a7e6000620200000000000056b46000630200000000000000ec60006402000000000000a72361006502000000000000e25b61006602000000000000f293610067020000000000001bcc61006802000000000000dade61006902000000000000590462006a02000000000000963c62006b02000000000000cc7462006c020000000000008c8762006d02000000000000ffac62006e020000000000003ae562006f02000000000000731d63007002000000000000b05563007102000000000000e98d630072020000000000001dc6630073020000000000005dfe63007402000000000000993664007502000000000000d86e6400760200000000000017a76400770200000000000051df640078020000000000008a1765007902000000000000c34f65007a02000000000000018865007b020000000000003ec065007c020000000000007af865007d02000000000000b63066007e02000000000000f06866007f0200000000000004a16600800200000000000041d966008102000000000000711167008202000000000000ac4967008302000000000000de8167008402000000000000f8b967008502000000000000b8cc6700860200000000000035f2670087020000000000006e2a680088020000000000001c3d680089020000000000007f6268008a02000000000000ba9a68008b02000000000000f3d268008c02000000000000310b69008d02000000000000704369008e02000000000000ae7b69008f02000000000000eeb3690090020000000000002bec6900910200000000000065246a009202000000000000a45c6a009302000000000000e0946a0094020000000000001dcd6a009502000000000000dbdf6a00960200000000000059056b00970200000000000018186b009802000000000000923d6b009902000000000000b0756b009a02000000000000e6ad6b009b0200000000000021e66b009c020000000000005e1e6c009d0200000000000096566c009e02000000000000d28e6c009f020000000000000ac76c00a00200000000000047ff6c00a10200000000000077376d00a202000000000000876f6d00a3020000000000000fa76d00a40200000000000059dc6d00a50200000000000022146e00a602000000000000464c6e00a70200000000000071846e00a802000000000000eea96e00a902000000000000aabc6e00aa0200000000000085eb6e00ab02000000000000e4f46e00ac020000000000001c2d6f00ad02000000000000da3f6f00ae0200000000000053656f00af020000000000008c9d6f00b002000000000000c4d56f00b102000000000000d90d7000b202000000000000d7457000b302000000000000f67d7000b402000000000000deb57000b502000000000000b2ed7000b602000000000000a9257100b702000000000000975d7100b802000000000000338c7100b9020000000000007e957100ba0200000000000068b17100bb0200000000000050cd7100bc020000000000001c057200bd02000000000000610e7200be02000000000000c13c7200bf020000000000006b747200c0020000000000005aac7200c10200000000000032e47200c202000000000000dcf67200c302000000000000321c7300c4020000000000002b547300c5020000000000007d8b7300c60200000000000020c37300c702000000000000cefa7300c8020000000000003c327400c9020000000000009b697400ca02000000000000eda07400cb0200000000000056d87400cc0200000000000090107500cd02000000000000ad2c7500ce020000000000000b367500cf02000000000000c7487500d002000000000000fe807500d10200000000000039b97500d20200000000000073f17500d30200000000000030047600d4020000000000004b207600d502000000000000a9297600d60200000000000006337600d702000000000000d3617600d80200000000000090747600d902000000000000089a7600da020000000000002fd27600db020000000000001a0a7700dc0200000000000022427700dd02000000000000007a7700de02000000000000d2b17700df02000000000000f8e97700e0020000000000002b227800e102000000000000635a7800e202000000000000a0927800e302000000000000daca7800e40200000000000011037900e502000000000000483b7900e60200000000000085737900e702000000000000b1ab7900e802000000000000dae37900e902000000000000121c7a00ea0200000000000049547a00eb02000000000000878c7a00ec02000000000000bfc47a00ed02000000000000edfc7a00ee0200000000000026357b00ef02000000000000606d7b00f0020000000000009da57b00f102000000000000cddd7b00f20200000000000006167c00f3020000000000003f4e7c00f402000000000000fb607c00f50200000000000077867c00f602000000000000b4be7c00f70200000000000014c87c00f802000000000000e0f67c00f9020000000000001b2f7d00fa0200000000000058677d00fb02000000000000959f7d00fc02000000000000d2d77d00fd02000000000000ec0f7e00fe0200000000000025487e00ff020000000000005f807e0000030000000000009ab87e000103000000000000d3f07e000203000000000000ee0c7f0003030000000000000a297f000403000000000000c53b7f00050300000000000043617f0006030000000000007b997f000703000000000000b9d17f000803000000000000f20980000903000000000000284280000a030000000000005e7a80000b0300000000000099b280000c03000000000000d2ea80000d03000000000000082381000e030000000000003e5b81000f030000000000007b9381001003000000000000b8cb81001103000000000000f30382001203000000000000313c82001303000000000000697482001403000000000000a6ac82001503000000000000c4c882001603000000000000e0e482001703000000000000ff00830018030000000000001e1d83001903000000000000dd2f83001a030000000000005b5583001b03000000000000988d83001c03000000000000d5c583001d0300000000000010fe83001e030000000000004e3684001f03000000000000826e84002003000000000000bba684002103000000000000f5de840022030000000000006f0485002303000000000000cc0d850024030000000000002c1785002503000000000000ea2985002603000000000000634f850027030000000000007e6b850028030000000000009a878500290300000000000017ad85002a03000000000000d2bf85002b0300000000000031c985002c030000000000000ef885002d030000000000004a3086002e03000000000000866886002f03000000000000bea086003003000000000000f2d8860031030000000000002a1187003203000000000000871a870033030000000000006449870034030000000000001d5c87003503000000000000998187003603000000000000cfb987003703000000000000eed5870038030000000000000cf2870039030000000000004a2a88003a03000000000000a83388003b03000000000000826288003c03000000000000b69a88003d03000000000000efd288003e030000000000002d0b89003f030000000000004d27890040030000000000006c4389004103000000000000ab7b89004203000000000000eab38900430300000000000028ec8900440300000000000068248a004503000000000000a05c8a004603000000000000b4948a004703000000000000f4cc8a00480300000000000030058b0049030000000000006f3d8b004a030000000000008e598b004b03000000000000ae758b004c03000000000000ecad8b004d0300000000000028e68b004e03000000000000331e8c004f030000000000004f568c0050030000000000008e8e8c005103000000000000c7c68c00520300000000000005ff8c00530300000000000041378d005403000000000000746f8d005503000000000000a4a78d00560300000000000064ba8d005703000000000000e4df8d0058030000000000000a188e00590300000000000023508e005a0300000000000027888e005b03000000000000d89a8e005c0300000000000043c08e005d0300000000000082f88e005e03000000000000c0308f005f03000000000000ff688f0060030000000000001ba18f00610300000000000059d98f006203000000000000981190006303000000000000d64990006403000000000000f56590006503000000000000158290006603000000000000758b9000670300000000000053ba9000680300000000000092f290006903000000000000d22a91006a03000000000000106391006b03000000000000489b91006c03000000000000a2a491006d030000000000001bd391006e03000000000000530992006f03000000000000d32e9200700300000000000090419200710300000000000074799200720300000000000094b19200730300000000000072e092007403000000000000d2e992007503000000000000b21893007603000000000000122293007703000000000000445a93007803000000000000739293007903000000000000f3b793007a03000000000000abca93007b030000000000005ddd93007c03000000000000c40294007d03000000000000e13a94007e03000000000000217394007f0300000000000059ab9400800300000000000090e394008103000000000000c31b95008203000000000000ea53950083030000000000009866950084030000000000000b8c9500850300000000000046c49500860300000000000057fc950087030000000000008f3496008803000000000000cf6c960089030000000000000ba596008a0300000000000045dd96008b03000000000000a3e696008c03000000000000801597008d03000000000000bc4d97008e03000000000000f78597008f030000000000002ebe9700900300000000000030f6970091030000000000005a2e98009203000000000000956698009303000000000000d49e9800940300000000000014d7980095030000000000003b0f990096030000000000006c4799009703000000000000ac7f9900980300000000000078b79900990300000000000026ca99009a030000000000007cef99009b0300000000000085279a009c03000000000000be5f9a009d03000000000000fd979a009e03000000000000b9aa9a009f0300000000000022d09a00a0030000000000003dec9a00a10300000000000058089b00a20300000000000074249b00a3030000000000008b409b00a403000000000000e4499b00a50300000000000038789b00a60300000000000076819b00a703000000000000e4af9b00a803000000000000b7e79b00a903000000000000731f9c00aa03000000000000a6289c00ab030000000000002f3b9c00ac0300000000000012579c00ad030000000000005d609c00ae03000000000000cb8e9c00af0300000000000057a19c00b00300000000000086c69c00b1030000000000005afe9c00b20300000000000002369d00b303000000000000bc6d9d00b40300000000000099a59d00b5030000000000004edd9d00b603000000000000db149e00b703000000000000e0399e00b803000000000000724c9e00b9030000000000002a849e00ba03000000000000ee9f9e00bb03000000000000d1bb9e00bc030000000000007df39e00bd03000000000000f02a9f00be030000000000006a629f00bf03000000000000ff999f00c0030000000000002ed19f00c1030000000000004608a000c203000000000000893fa000c303000000000000a476a000c403000000000000dfada000c5030000000000001cb7a000c6030000000000003ce5a000c703000000000000921ca100c8030000000000008c53a100c903000000000000988aa100ca0300000000000010a6a100cb03000000000000a0c1a100cc03000000000000e5d3a100cd0300000000000072f8a100ce030000000000007c2fa200cf030000000000003766a200d003000000000000389da200d10300000000000056a6a200d203000000000000a9b8a200d303000000000000cac1a200d4030000000000001ad4a200d503000000000000200ba300d6030000000000002714a300d703000000000000bc41a300d8030000000000006778a300d9030000000000000aafa300da0300000000000046dca300db0300000000000065e5a300dc03000000000000a81ba400dd03000000000000d72da400de030000000000002352a400df030000000000006288a400e003000000000000c1bea400e103000000000000f8f4a400e203000000000000212ba500e3030000000000003f61a500e403000000000000656aa500e503000000000000e497a500e60300000000000040cea500e703000000000000b204a600e803000000000000fc3aa600e9030000000000009471a600ea0300000000000037a8a600eb030000000000001adfa600ec03000000000000ea0ca700ed030000000000000e16a700ee030000000000005228a700ef030000000000007d31a700f003000000000000034da700f1030000000000002084a700f2030000000000004a8da700f303000000000000a99fa700f403000000000000f6baa700f503000000000000c1f1a700f603000000000000be28a800f703000000000000a65fa800f8030000000000003e7ba800f903000000000000c296a800fa03000000000000c3cda800fb03000000000000d504a900fc03000000000000f83ba900fd030000000000005f73a900fe03000000000000ceaaa900ff030000000000000bb4a900000400000000000005e2a90001040000000000005e19aa000204000000000000c12baa0003040000000000008e50aa000404000000000000fd62aa0005040000000000008175aa000604000000000000fa87aa0007040000000000002f91aa0008040000000000005dbfaa000904000000000000a3c8aa000a04000000000000e5f6aa000b04000000000000e41bab000c040000000000005b2eab000d04000000000000e765ab000e040000000000004c9dab000f0400000000000085a6ab001004000000000000b8d4ab001104000000000000fdddab0012040000000000003b0cac001304000000000000d043ac001404000000000000827bac001504000000000000b8a0ac0016040000000000005bb3ac00170400000000000029ebac0018040000000000006af4ac0019040000000000000e07ad001a04000000000000f422ad001b04000000000000432cad001c040000000000009935ad001d04000000000000ee3ead001e04000000000000d55aad001f04000000000000bd76ad002004000000000000a592ad00210400000000000076caad002204000000000000f6dcad002304000000000000e001ae0024040000000000004f39ae0025040000000000001371ae0026040000000000005f7aae002704000000000000fc8cae002804000000000000cda8ae0029040000000000005ebbae002a0400000000000081e0ae002b040000000000004f18af002c040000000000001e50af002d04000000000000e687af002e04000000000000a0bfaf002f040000000000005ff7af003004000000000000042fb0003104000000000000da66b00032040000000000009a9eb000330400000000000063d6b0003404000000000000300eb1003504000000000000da45b10036040000000000009a7db100370400000000000050b5b100380400000000000029edb1003904000000000000971bb2003a04000000000000e024b2003b04000000000000995cb2003c040000000000006694b2003d0400000000000048b0b2003e040000000000002eccb2003f0400000000000075d5b200400400000000000008e8b2004104000000000000e703b3004204000000000000ce1fb3004304000000000000b63bb30044040000000000000d45b30045040000000000009f57b30046040000000000007573b3004704000000000000c67cb30048040000000000003aabb3004904000000000000e4e2b3004a04000000000000651ab4004b04000000000000f951b4004c040000000000009389b4004d0400000000000025c1b4004e04000000000000f6f8b4004f04000000000000241eb5005004000000000000b130b50051040000000000007068b500520400000000000040a0b5005304000000000000ecd7b50054040000000000000510b60055040000000000003e48b60056040000000000007a80b6005704000000000000b7b8b6005804000000000000f3f0b60059040000000000002f29b7005a04000000000000ae4eb7005b040000000000006861b7005c04000000000000a599b7005d04000000000000ded1b7005e040000000000005cf7b7005f04000000000000160ab80060040000000000005042b8006104000000000000964bb8006204000000000000687ab8006304000000000000a6b2b800640400000000000066c5b8006504000000000000e5eab80066040000000000000423b90067040000000000003f5bb90068040000000000005d77b90069040000000000007b93b9006a04000000000000b7cbb9006b04000000000000ef03ba006c04000000000000133cba006d040000000000003358ba006e040000000000005174ba006f0400000000000042acba0070040000000000006ce4ba007104000000000000a21cbb007204000000000000e054bb007304000000000000405ebb0074040000000000001b8dbb0075040000000000002ec5bb0076040000000000006dfdbb007704000000000000a435bc007804000000000000d06dbc0079040000000000000ca6bc007a040000000000004adebc007b040000000000008716bd007c04000000000000c34ebd007d04000000000000fc86bd007e040000000000003bbfbd007f040000000000007af7bd008004000000000000d500be008104000000000000b32fbe008204000000000000ea67be00830400000000000027a0be00840400000000000065d8be008504000000000000a410bf008604000000000000dd48bf0087040000000000003b52bf0088040000000000001881bf0089040000000000008fb8bf008a04000000000000cbc1bf008b04000000000000f8efbf008c040000000000007602c0008d040000000000008327c0008e04000000000000075fc0008f040000000000005d96c000900400000000000009cec00091040000000000003b06c10092040000000000002d3ec10093040000000000006476c10094040000000000007aaec1009504000000000000b9e6c1009604000000000000ef1ec20097040000000000002c57c2009804000000000000698fc20099040000000000008cc7c2009a040000000000009effc2009b04000000000000da37c3009c04000000000000ee6fc3009d0400000000000029a8c3009e0400000000000067e0c3009f04000000000000240fc400a0040000000000008218c400a104000000000000b150c400a204000000000000c088c400a304000000000000d2c0c400a404000000000000f6f8c400a5040000000000001231c500a604000000000000d143c500a7040000000000004d69c500a80400000000000089a1c500a904000000000000c4d9c500aa040000000000000112c600ab040000000000005c1bc600ac040000000000003a4ac600ad040000000000007482c600ae04000000000000abbac600af04000000000000e4f2c600b0040000000000001d2bc700b1040000000000002e47c700b2040000000000004863c700b304000000000000687fc700b404000000000000829bc700b5040000000000009bd3c700b604000000000000d80bc800b7040000000000001144c800b804000000000000704dc800b904000000000000d056c800ba040000000000004e7cc800bb0400000000000080b4c800bc04000000000000b1ecc800bd040000000000009808c900be040000000000008d24c900bf04000000000000c75cc900c004000000000000df94c900c104000000000000feb0c900c2040000000000001dcdc900c3040000000000004605ca00c4040000000000006e3dca00c5040000000000009e75ca00c604000000000000029bca00c704000000000000aeadca00c8040000000000008adcca00c904000000000000eae5ca00ca04000000000000251ecb00cb04000000000000fa55cb00cc04000000000000778ccb00cd04000000000000eec3cb00ce0400000000000005fccb00cf040000000000004134cc00d004000000000000716ccc00d10400000000000096a4cc00d204000000000000d3dccc00d30400000000000086efcc00d4040000000000000215cd00d504000000000000ac27cd00d604000000000000264dcd00d7040000000000008656cd00d8040000000000006385cd00d9040000000000003bb4cd00da0400000000000099bdcd00db04000000000000d8f5cd00dc04000000000000172ece00dd040000000000005366ce00de04000000000000909ece00df04000000000000b7d6ce00e00400000000000068e9ce00e104000000000000cc0ecf00e2040000000000000547cf00e304000000000000427fcf00e40400000000000079b7cf00e504000000000000b8efcf00e604000000000000f427d000e7040000000000000b60d000e8040000000000004698d000e90400000000000083d0d000ea04000000000000c008d100eb04000000000000fa40d100ec040000000000003679d100ed0400000000000073b1d100ee0400000000000087cdd100ef04000000000000a6e9d100f004000000000000e521d200f1040000000000001e5ad200f2040000000000005692d200f30400000000000092cad200f40400000000000052ddd200f504000000000000ce02d300f604000000000000e13ad300f7040000000000003444d300f804000000000000dc56d300f904000000000000ef72d300fa040000000000004d7cd300fb0400000000000024abd300fc04000000000000a1d0d300fd040000000000005be3d300fe04000000000000901bd400ff04000000000000ce53d40000050000000000000a8cd40001050000000000003ac4d40002050000000000004ae0d400030500000000000069fcd4000405000000000000a134d50005050000000000006047d5000605000000000000de6cd50007050000000000001ba5d500080500000000000058ddd50009050000000000009415d6000a05000000000000d24dd6000b05000000000000f085d6000c050000000000001ebed6000d05000000000000fbecd6000e050000000000005bf6d6000f050000000000008b2ed7001005000000000000c566d7001105000000000000029fd700120500000000000036d7d70013050000000000006f0fd80014050000000000009f47d8001505000000000000c97fd8001605000000000000e4b7d80017050000000000001ff0d80018050000000000005928d90019050000000000009560d9001a050000000000005473d9001b05000000000000718fd9001c05000000000000d198d9001d0500000000000031a2d9001e050000000000000fd1d9001f05000000000000cfe3d90020050000000000004f09da0021050000000000008941da002205000000000000b979da002305000000000000edb1da00240500000000000047bbda00250500000000000054d7da00260500000000000007eada00270500000000000067f3da0028050000000000003a22db0029050000000000005e5adb002a050000000000007892db002b05000000000000b0cadb002c05000000000000e702dc002d05000000000000183bdc002e050000000000007644dc002f050000000000002773dc003005000000000000dd85dc0031050000000000004dabdc00320500000000000086e3dc003305000000000000bb1bdd003405000000000000944add003505000000000000f453dd003605000000000000ad66dd003705000000000000298cdd00380500000000000060c4dd0039050000000000009cfcdd003a05000000000000fa05de003b05000000000000d734de003c05000000000000b56cde003d0500000000000045a4de003e05000000000000a1d2de003f05000000000000e4dbde0040050000000000002fe5de0041050000000000003c05df004205000000000000d81adf004305000000000000d636df0044050000000000002840df004505000000000000d252df004605000000000000cf6edf004705000000000000a9a6df004805000000000000eeafdf00490500000000000047b9df004a05000000000000b1dedf004b050000000000000de8df004c050000000000006e0de0004d05000000000000cb16e0004e05000000000000d84ee0004f050000000000007886e0005005000000000000b3bee0005105000000000000c3f6e0005205000000000000fe2ee10053050000000000002c67e1005405000000000000e679e1005505000000000000a68ce1005605000000000000629fe10057050000000000009bd7e10058050000000000005806e2005905000000000000b10fe2005a05000000000000e647e2005b050000000000001880e2005c050000000000007689e2005d050000000000004cb8e2005e050000000000007ef0e2005f05000000000000b228e3006005000000000000e760e30061050000000000002499e300620500000000000060d1e30063050000000000009c09e4006405000000000000d441e4006505000000000000334be40066050000000000000a7ae4006705000000000000e0a8e400680500000000000040b2e40069050000000000006feae4006a05000000000000a022e5006b05000000000000de5ae5006c050000000000001a93e5006d0500000000000055cbe5006e050000000000000bdee5006f050000000000008203e6007005000000000000db0ce6007105000000000000b53be6007205000000000000f073e60073050000000000004e7de60074050000000000002cace60075050000000000008cb5e60076050000000000006be4e6007705000000000000a51ce7007805000000000000dc54e7007905000000000000168de7007a050000000000004ac5e7007b0500000000000057fde7007c050000000000009335e8007d05000000000000d06de8007e050000000000002e77e8007f0500000000000004a6e80080050000000000003fdee80081050000000000007b16e9008205000000000000b74ee9008305000000000000e886e900840500000000000015bfe900850500000000000046f7e9008605000000000000602fea0087050000000000000442ea0088050000000000005a4bea0089050000000000006a67ea008a05000000000000889fea008b05000000000000daa8ea008c0500000000000079d7ea008d050000000000009f0feb008e050000000000005c22eb008f050000000000001c35eb009005000000000000d847eb0091050000000000000e80eb0092050000000000003eb8eb00930500000000000076f0eb009405000000000000ad28ec009505000000000000e660ec0096050000000000002399ec00970500000000000060d1ec0098050000000000009e09ed0099050000000000005e1ced009a05000000000000da41ed009b050000000000009654ed009c050000000000005567ed009d05000000000000127aed009e050000000000004ab2ed009f0500000000000082eaed00a005000000000000e1f3ed00a105000000000000bd22ee00a205000000000000fa5aee00a3050000000000003493ee00a405000000000000929cee00a50500000000000070cbee00a605000000000000ac03ef00a705000000000000eb3bef00a805000000000000fb73ef00a905000000000000feabef00aa05000000000000bebeef00ab0500000000000038e4ef00ac050000000000004e1cf000ad050000000000008854f000ae05000000000000958cf000af05000000000000c5c4f000b005000000000000fffcf000b1050000000000002e35f100b205000000000000de47f100b305000000000000466df100b4050000000000005da5f100b50500000000000094ddf100b605000000000000c115f200b705000000000000fa4df200b8050000000000002d86f200b90500000000000067bef200ba05000000000000a0f6f200bb05000000000000b52ef300bc050000000000003254f300bd05000000000000ef66f300be05000000000000239ff300bf0500000000000032d7f300c005000000000000dde9f300c1050000000000001e0ff400c2050000000000004f47f400c3050000000000008d7ff400c4050000000000006bb7f400c5050000000000009beff400c605000000000000c927f500c705000000000000ff5ff500c8050000000000003198f500c90500000000000063d0f500ca050000000000008908f600cb05000000000000c240f600cc050000000000001d66f600cd05000000000000ca78f600ce05000000000000fbb0f600cf0500000000000031e9f600d0050000000000006021f700d1050000000000009e59f700d205000000000000d891f700d3050000000000000acaf700d4050000000000004402f800d5050000000000007b3af800d605000000000000fa5ff800d705000000000000b672f800d805000000000000ebaaf800d90500000000000048b4f800da0500000000000024e3f800db05000000000000601bf900dc050000000000009753f900dd05000000000000ac8bf900de05000000000000e3c3f900df050000000000001cfcf900e0050000000000005934fa00e105000000000000936cfa00e205000000000000a7a4fa00e305000000000000dfdcfa00e4050000000000001a15fb00e5050000000000004d4dfb00e605000000000000a656fb00e7050000000000007b85fb00e805000000000000a2bdfb00e905000000000000dff5fb00ea050000000000005f1bfc00eb050000000000001e2efc00ec050000000000005266fc00ed050000000000000c79fc00ee05000000000000cc8bfc00ef050000000000002995fc00f005000000000000899efc00f105000000000000c1d6fc00f2050000000000007ee9fc00f3050000000000003dfcfc00f405000000000000f00efd00f5050000000000004c18fd00f6050000000000001a47fd00f7050000000000004a7ffd00f80500000000000086b7fd00f905000000000000beeffd00fa050000000000001ef9fd00fb05000000000000ee27fe00fc050000000000000944fe00fd050000000000002560fe00fe05000000000000307cfe00ff050000000000002798fe000006000000000000e2aafe00010600000000000042b4fe0002060000000000005dd0fe0003060000000000009a08ff000406000000000000ca40ff000506000000000000244aff000606000000000000f278ff0007060000000000002db1ff00080600000000000063e9ff000906000000000000712100010a06000000000000313400010b060000000000004c5000010c06000000000000ac5900010d06000000000000b49100010e06000000000000e3c900010f06000000000000f60101011006000000000000103a010111060000000000003056010112060000000000004c720101130600000000000084aa01011406000000000000c2e201011506000000000000fe1a02011606000000000000235302011706000000000000618b020118060000000000009dc3020119060000000000005ad602011a06000000000000badf02011b06000000000000d7fb02011c06000000000000370503011d06000000000000f71703011e06000000000000133403011f06000000000000516c03012006000000000000107f030121060000000000008da403012206000000000000cadc03012306000000000000f81404012406000000000000324d0401250600000000000070850401260600000000000080bd040127060000000000008bf504012806000000000000842d05012906000000000000d73605012a060000000000008b6505012b06000000000000c19d05012c06000000000000f9d505012d060000000000002e0e06012e06000000000000664606012f060000000000009d7e06013006000000000000d7b60601310600000000000011ef06013206000000000000442707013306000000000000725f07013406000000000000af9707013506000000000000e7cf070136060000000000001f0808013706000000000000372408013806000000000000544008013906000000000000917808013a06000000000000c8b008013b0600000000000001e908013c060000000000000f2109013d06000000000000085909013e06000000000000a99009013f06000000000000b5c809014006000000000000c5000a014106000000000000d2380a01420600000000000006710a014306000000000000f5a80a0144060000000000002be10a01450600000000000012190b01460600000000000048510b01470600000000000086890b014806000000000000e5920b014906000000000000c4c10b014a0600000000000000fa0b014b060000000000001d320c014c060000000000000b6a0c014d06000000000000c5980c014e060000000000001aa20c014f06000000000000d7d00c0150060000000000002dda0c01510600000000000069120d015206000000000000a44a0d015306000000000000df820d0154060000000000001dbb0d01550600000000000055f30d015606000000000000852b0e01570600000000000083630e015806000000000000c39b0e0159060000000000001ba50e015a060000000000007bae0e015b06000000000000f7d30e015c06000000000000afe60e015d06000000000000290c0f015e0600000000000065440f015f06000000000000db690f016006000000000000977c0f016106000000000000d2b40f016206000000000000ecec0f016306000000000000062510016406000000000000ea5c10016506000000000000f49410016606000000000000ffcc100167060000000000005ed610016806000000000000d6fb10016906000000000000340511016a06000000000000613d11016b060000000000008b7511016c06000000000000919111016d06000000000000abad11016e06000000000000e0e511016f060000000000001d1e120170060000000000005556120171060000000000006c8e120172060000000000008aaa12017306000000000000a3c612017406000000000000bdfe12017506000000000000f83613017606000000000000126f130177060000000000006c9413017806000000000000c99d1301790600000000000029a713017a060000000000005bdf13017b06000000000000b8e813017c0600000000000016f213017d060000000000008d1714017e06000000000000ec2014017f06000000000000a43314018006000000000000bc4f14018106000000000000d58714018206000000000000919a1401830600000000000005c0140184060000000000005fc914018506000000000000f8f714018606000000000000a10a15018706000000000000fa1315018806000000000000561d15018906000000000000fa2f15018a06000000000000513915018b06000000000000aa4215018c06000000000000106815018d060000000000002f8415018e060000000000004ba015018f060000000000002cbc15019006000000000000ccce1501910600000000000019d81501920600000000000076e115019306000000000000331016019406000000000000664816019506000000000000998016019606000000000000d5b81601970600000000000093cb16019806000000000000f3d4160199060000000000000ff116019a06000000000000cd0317019b06000000000000492917019c06000000000000a33217019d06000000000000444517019e060000000000003a6117019f06000000000000117d1701a0060000000000001c991701a10600000000000059d11701a2060000000000008c091801a306000000000000c2411801a4060000000000001e4b1801a50600000000000037671801a606000000000000f2791801a7060000000000001fb21801a806000000000000dec41801a90600000000000056ea1801aa0600000000000005fd1801ab0600000000000079221901ac06000000000000b25a1901ad06000000000000e5921901ae06000000000000f9ca1901af060000000000005df01901b00600000000000017031a01b1060000000000003a3b1a01b206000000000000e64d1a01b30600000000000044731a01b406000000000000a37c1a01b50600000000000078ab1a01b6060000000000006ee31a01b706000000000000921b1b01b806000000000000be531b01b9060000000000001d5d1b01ba06000000000000ec8b1b01bb0600000000000009c41b01bc06000000000000e5fb1b01bd06000000000000f1331c01be06000000000000ef6b1c01bf06000000000000a39a1c01c006000000000000fba31c01c106000000000000f2db1c01c206000000000000f8131d01c306000000000000df4b1d01c40600000000000075831d01c506000000000000aaa81d01c6060000000000003bbb1d01c7060000000000002fd71d01c80600000000000017f31d01c90600000000000067fc1d01ca06000000000000ad211e01cb06000000000000fb2a1e01cc0600000000000052341e01cd06000000000000da621e01ce06000000000000c87e1e01cf06000000000000b09a1e01d00600000000000089d21e01d1060000000000000fe51e01d2060000000000005fee1e01d3060000000000003b0a1f01d406000000000000f8411f01d50600000000000098541f01d606000000000000ac5d1f01d70600000000000094791f01d8060000000000006eb11f01d90600000000000038e91f01da060000000000000b212001db06000000000000e6582001dc06000000000000c8902001dd0600000000000062a32001de060000000000007ac82001df060000000000001cdb2001e0060000000000005d002101e10600000000000021382101e206000000000000f76f2101e3060000000000003d792101e406000000000000cea72101e50600000000000095df2101e6060000000000006e172201e706000000000000334f2201e80600000000000085582201e90600000000000010872201ea06000000000000eea22201eb06000000000000cbbe2201ec06000000000000a9da2201ed060000000000009ef62201ee060000000000003d092301ef06000000000000782e2301f0060000000000000c412301f1060000000000005e4a2301f20600000000000045662301f3060000000000003b822301f406000000000000299e2301f506000000000000fed52301f606000000000000990d2401f7060000000000002c202401f806000000000000173c2401f90600000000000063452401fa06000000000000fd572401fb060000000000002a7d2401fc0600000000000000b52401fd06000000000000b8ec2401fe0600000000000037242501ff06000000000000155c25010007000000000000e69325010107000000000000a6cb25010207000000000000630326010307000000000000b30c260104070000000000000916260105070000000000005b1f26010607000000000000523b260107070000000000004857260108070000000000002d732601090700000000000018ab26010a07000000000000fdc626010b07000000000000ede226010c070000000000008d1127010d07000000000000e31a27010e07000000000000cc5227010f07000000000000ac8a270110070000000000004b9d2701110700000000000090c22701120700000000000087fa27011307000000000000583228011407000000000000fe6928011507000000000000557328011607000000000000f4a128011707000000000000ced9280118070000000000007d1129011907000000000000414929011a070000000000001a8129011b07000000000000deb829011c07000000000000bff029011d07000000000000a8282a011e070000000000008b602a011f07000000000000dc692a0120070000000000002d732a0121070000000000007a7c2a012207000000000000198f2a01230700000000000069982a01240700000000000003ab2a0125070000000000004ab42a0126070000000000009ebd2a01270700000000000041d02a012807000000000000e7e22a01290700000000000089f52a012a0700000000000023082b012b07000000000000cb1a2b012c0700000000000018242b012d070000000000006b2d2b012e07000000000000ba362b012f070000000000000e402b013007000000000000af522b013107000000000000035c2b0132070000000000004c652b0133070000000000009b6e2b013407000000000000e4772b013507000000000000abaf2b013607000000000000f8b82b01370700000000000052c22b01" + "babeEpochChanges": "0x0458f6448501174951cd92aa253e1dca05ff4487a8b86ca45b699e2e7bef36456f4644300101b38bfe10000000001395fe100000000004dc81f2058c70567f7c85ded467631941c2efb85ba96e2c9328f10be4774092dc904d3001011395fe1000000000739efe10000000001064de6cab75353df51c9bc549ea19c3fd6bb2094b10745ec5aa63db9576b9d15de456300101739efe1000000000d3a7fe1000000000007921f499584ea60af4fc6c621d1585b79e3852fcc929fce53d68e7d6f5f16c8fe456300101739efe1000000000d3a7fe1000000000009ea154e5d5448f812bcac06720992209518325b0527502738bbbcedc30413c24e456300101739efe1000000000d3a7fe100000000000ffb5d0e61bb7150459291768cdad47428dce5d980d4975c4e1e21ad0b43a059fe456300101739efe1000000000d3a7fe100000000000001858f6448501174951cd92aa253e1dca05ff4487a8b86ca45b699e2e7bef36456f46443001019b20000000000000b38bfe10000000006009000000000000a50432904ec260963195582a1d339f9fbd2d5d76f551160105c922423cad0d94482f010000000000000076441c448aefcf40a72128edc9b44a4f7ef9c267c503e98f5f9c72d5e9e92f000100000000000000526e055ade4ac425e9b5f93ce4394601335d3599a5b742603126d78ce99a4a540100000000000000d0e8ddfdeacd8e163b01ca4da1a4e856312b0de412b492247070f2721f7d803801000000000000008008c1b7061a2402634fc15d3849e2913863beb9f55024bc8cc7fa7d6e397817010000000000000024a51a9bdb67213626d1b52bd8dbc0e9b94ea88ea417aa17b56212d1cea3e1780100000000000000488d520146f681678e9d229f5e29354edf65e521246b28a4175c0502e060b9200100000000000000c681c1acaa82eddba6e394ddc9a2fd1af34418448d544c34966a31c837667f280100000000000000ba395fcb33327501109ed40712c7a372d25bf3339edfabe2a1964fb7b5d4d82401000000000000009cb389c209afbebda2b12113e0266b3d30f46e2a91aaf4451c193d640288357101000000000000004c9886e2e62ee92a6778d6a7928052732044b64fa61969cd8e37f3f7e3406f720100000000000000c056f1879c1fd443e38244c26ef138218b3e43e70b1cb84bd7242e354cc9ee0e010000000000000026db7c5786fddc15f7e96905024905d877537451ed444cb97d3786361a59f64b0100000000000000c67b1b3084dc3eb2cc7a3cc4f742defc21b733e787737cbaf3b146a052633e0f01000000000000005237e4509f24bc9e8bf9bfd78b594219d86853ae16601f692f10c9b16b88f83b010000000000000098192016f83ef2fe74dba1ecc6526efc61b79f3177c00dc7c053160391858f700100000000000000a6f10752adf745ad55866031836194ad027ed8d6710d9853ef62982bcf45fd0e010000000000000078c35105ea4cd9d6ea0ba91b2c19e78f60931bef5918c1bd2e14259229e7c330010000000000000006d2846642c835b0fb1ff1ef908449376aa8e7c0f3352e55da9a1e97e9528b230100000000000000f8a681118ea0bb9dfde2813ce5144eeb5cee881c27883de1c0c759255ec32654010000000000000000b84e6e296de1009aeca95ee09bc5173aec6e91b1145b247d69e47758878972010000000000000090d25f2368ee57fb5c100140b7507d5831fb035e7632c53b532b65e6d14ba8480100000000000000e67c524e443cda4cd27dfcce70488a5d23a93c8c46a5e83ef5a69eff3a02fa5a0100000000000000a42289d68c963358f3c450a850242bb53121e73e17f0e2ea2b93327446bea33c01000000000000006c50859d9dde209012eb3868c1a3a6e80ae8fa528ace9df68e92dbbae60368200100000000000000a8e470f2339e3ed0da456780dd9207e9c6a02459238ec3057a6ade01fd6cd60a01000000000000005c7f05d77f853f3eb8d4989fce36d0808b6d2b881e26f13c01e939b5d489a57d01000000000000002addf696d5a42b0a3dada689731e00c991db936909df869ac6600662abc35310010000000000000072ed7192625403acef94aa9189f9f179deb89e60478816ca96c79b742f757e750100000000000000b4ffe3c5959ff37c11c6f19d91926cb97aa4bf0f604919e1753bb55664d061680100000000000000bc4c9b5425f9a2aa09e3239332c702dedbfffa2b9f4cc1b978b307fc1fa1337c0100000000000000e07d5b19d98a6f8ef5c964b507fcd88f500a2a0a9afd5cffe9d4e3f74d83b27f010000000000000024532b17fc5fb786660c52aeb03150799165dd05e88ce359189189a4b771f51e01000000000000008610e1f00a1eba67d13225867c1f2972e60604e49bea7e5c1b10b29d4841b84a0100000000000000be18787b5177e58664cd893fdaa20a3ca1bc9f1acbbb15036b046ae49c17c15b0100000000000000acef6dc8da16677955c38451be5a1b369fdc3c20bc249a1aec917276dfc2da580100000000000000c49cfd152ce3ac1fa142b3b6e720cb173eb7f43c82f021418253a070036f870c01000000000000006ec27dfa7ac9d35eb002c55d3e4d56b4df928dd5c44323ac228305741c9e09360100000000000000b89cbc83a386d6f5d4fed93289ee50fdf69d77369ca0c9a8b962554e3fc0d37e01000000000000009237113cf97fee5fafbeb82de593f6125e9c498bd59f0369625f46b326c7d9170100000000000000722d7d57085c250af633f2d461874d59aebc8021eb1112ec8805db5ddea53e5a0100000000000000a20797f3a8669a909adb22a3aee2844dba82d231cc33f5d9be0e2c533cb82a6701000000000000006a1274b6748bf822ba80c9a9416abd3cf591b7aee6adabb8359b7dbed8ebb3770100000000000000dc1274e0689c7a3eac31b41ce352719529e65c01f26999f74ce17c9905fce87401000000000000009c9bc1074cf465c0dd39f74bfdf16a67f81339ba2ad117a0c7030b4f0678771701000000000000005c0494412a296a92296160ac510697d97288753829a5e9d02eafb5f101e60f510100000000000000d8b38c77823eb1912bf8b743cca6c655ea1844ee468fbd78b394bf222bf8bc2001000000000000007251d6c376064f07f27d2532b05c091bd0978067b078c9f8d9984fd4216bdd4b0100000000000000487c6aad1cc26893dc7e498916a4c23d303f098c04b0a8b0c8242fbb7e73a16e010000000000000088f9a16886165d00612032cb1b36669ad62b7325536f499191e711134c71b6070100000000000000bc4b95226de4e10f91e0254cfe4541232252deaa347f567df124aba81bac4d3f010000000000000032636c64cae326ea37dfa4ddad688feb9829ada7a7d580a91ce03a50a673d01c01000000000000001eb833e31087d6baffee4e7f1d9a8e3b7013ea392c81f74313a354ba82e92f6b01000000000000009c8c7c8c91df0ed53864f69017d530b5ebda3ab4bde3c67027e70893213d533a010000000000000018ec239eec5457ba11a41518e7c5f98266d1bdbd67602641d04706f95dba5c560100000000000000c65c0a74887e9fe5cc56696fac7e7f5f1cd4a68f9661c8384b300bcdfbe67a1801000000000000003690e6ef639f685849ed93a6386d1fccf026c3fb64520940aa46af97f929e112010000000000000028a027ca1c0bdeebfc8fce85ac4bac48cc072523d9c4a86b4f2594f9142e7e3b010000000000000042e4c41a899dfb238649e5b17dc232c2699353635d60e6a3bdcd71f9b82cda300100000000000000ce4bfd8c5611b1637066ef9e579c85efadfc9513b882184e00b75871ef7f5a2d01000000000000005c0419f37036f2bf999f3958b49f63ab19d6dc19847a393dfd26cf303fc8d911010000000000000028558e46037c51ece4d39a8a4d34688662e629413c221d6226afe454240e70210100000000000000ee82f2670e36b9ad136ae1ab1607c35f3b49a8c93b86802c06df3ca62a2e3561010000000000000024a0c6db2090170748a7bae71b6f77b5dcc14c6acc5c58e8de78d317ccafe14401000000000000004a2073ae31b3df10d285eae6a5befe069183c4c6a6ffa1b2bf432011d0d475200100000000000000e41b3ecad757b0a5ecbc6b29691681df25b3d2b5f1ea325b648e607a5d76cf0801000000000000005461977495f9c407a8d951e860a1cb2087592103229bdbd879629cc538a4182b0100000000000000b05ad6cde0dfc019d740c3f50b8aac16550ff4c197da19cf23b9293f0c5c39070100000000000000bc56c07cea21bcbbe058aedd2ced9fb4757caead55f96bda9bed1c9669c32b64010000000000000078e1a4fecbaac940c04e0b591a01ea66a574b5098852ded2810e3a534971111f01000000000000006ccf2ce8e149999a7bb996faa65194e60aeb7bcd1937c787f886fe979fb49e6601000000000000000e5650026c7bee4fa43a2c7fcdc3452daa10b0530863ec686b1d5ee4d707600501000000000000001e866bed92016cd2dcabe2d87fcaf8c1d7248255cafb9e10638fc3a2b476221b0100000000000000946071eab9c0fa1de9be2ad3c18041f1326faab41d84d9daf9f89c0daf9c0f00010000000000000082b820c5bee8ee77e35203dab387f3434b8502e5f1c35dfb2ad15b5c89d47b3c01000000000000001cf3446b4b5116a1784d92cdc5101e55a5fb91ed3d93efccd06b304a94362d0a0100000000000000c6d5dc6e1ec83491397390449d8cddaa88631e8855efe50697788a93de00fb550100000000000000220d3f26072ad42aa5ca04b7253284d185f8bf95650faa170cbda8d7a47ea84a01000000000000003a4b0919068523aa04ab29f1b49bdc03a176a4b93f9b5a7e6e0cdcc8318691030100000000000000b288a9832e07bef83c5a8ca72c5a5583b321672ba7c6cdd44a971f855d32d95c01000000000000007480edf84ab569e559dccc99b87ecb9ae9db670b45a259b7f6e618b063e43113010000000000000020bedd48a5965e2fc0e221bd164deecdee849eb69cb8dc63a37df80b50a3093b010000000000000026c4a27200f70748b52f7277150d2db7e192b258d5001412e42c62c6e3ee1e5101000000000000004628f93047462b43ec0886f2c7d7318ddad1764fd32af4f32ef0b2dcfa4b297a010000000000000040a2527ffa7d30d788eca127d435c8b5aa48972cda538b9a1627a57e85c8fa1901000000000000003635c55546f19bfe62d84a220c4396b1c9d71a1acdb2da917a82f0c1415a2b020100000000000000844b691aa95ff9a15b50f5e5f4f0e582db6621326cf18d7533f55bc27549497a01000000000000002254fb9324a6a9af450ce3a4f5ab25f55deb22161e520b2308b8aaff42e3aa7401000000000000007c4b93d862704aad434ab3dc2cbef824df738c5dbe1ba7b34daa38b2aabf7c36010000000000000028e972febaf463f22d1108053e7c26ccde1e6018d7c302985bc227557e0a663b01000000000000007c4f928b915062d9cb15e854a9476cddbf7126c9de2fd70f67beaf2ebf6dbc5c0100000000000000fced8f1dff4f6c6852b0d643e26ee532086e72be7aecee28d94d1d59b5f9986701000000000000004a905d0574cebf6e8d00d382b104fc8ee1c008f1b9ffa6fa5c3b67ff29719c0d01000000000000008c64cd873a53fec10c4624239ce35d31d4422e32a109605a162fcbf632427733010000000000000026d7422872cbf4d4918046f240a13a37219a272f4326b3f3bd1249829bbcd12b0100000000000000be6106f9217a1847af66de9510fdfb40514409556506ddc1c1a897818434125b0100000000000000da98e4363908fa4d7980fe5574ceeac74fae49bf77b3a191654c7731214a565e0100000000000000ae2e94f092fbcfe263519f950b5ade09c474258a4e0d5e62570d02b3f71d85480100000000000000bca6409d6d7e4f94ce797594db4363bb8bebd5387770aee0bb7663b36354fe2a0100000000000000b2518044cc31062ee50fa81cb6983f314291a0300865fa5cfe149829c5050d24010000000000000086c1922e4ed392d72e0fbc0ee28e7ec0a8ba2b33470330a606cec9a159a79626010000000000000036465f4be77147914969ea78f8e39610310679011dfbb6137dab12e18a687a5201000000000000004e8cc21504fda961cf1cfe78e651d033b10f8ab1a4a0c757bd4848a7f2827f0601000000000000004ad8fedb395dc0ed63e0edbdbd2d20555b61a46aa7cd751e4308335c277cbd6a01000000000000004c5e6997b6f186855b1f4c9f8ab2d6cea3da2e86445605ab89e5b5821e05bd3d0100000000000000a6cd7eca570e90e2efeeda8f1c09480884a073c66fc7c41b2464e11822b12f0c0100000000000000944ad19383a9ae136f4f11c15687923b9b21319efab021336a3e8f2bd5b5ca20010000000000000068508b2ca3e01d7c8d79d99f1bb06a93058d14f1061d5fed4df13d4bc30aa557010000000000000074f02ed037d28c883df643034a596e4d2a97a23782ee8483c9ae3429ede7e7090100000000000000b045bf0235bbe708e4d6918758650c9c7f9ab4d638e4a841807ed7c82ff7f63a01000000000000005c252543704920d6bea67453cdd61b464b001badf73a3ea3b9e9fb35b224947201000000000000006e7a78e9fdfe275f3e000382ba30452729970578258839db6c0fc568e20b3515010000000000000004734733edcd9cf662389208fb8ccb5f274a7db8187ccc53dc84250f8599d54d01000000000000004e1b48e67c1e62e46add39fa523b956946228ea0f08bd9d20ced798cfc9a0f5b010000000000000010fee28789d45569ac0c95b7287fc7c5f087d93516cbd06e3c074a392d86da300100000000000000faa6ae896c2d1040e495acbdcd8d90a02ccb17ba6e507efa2f7deacb3b28466e0100000000000000840290d318350bff32db3dcf6138b822cb2adf1dedf5bad8729471988955915c0100000000000000907ff7ac1e6c451d236c05c8d3f85640d9f9472d6a30115fc26135dae020e6380100000000000000c264fe63e84cd004530d2a3eabdde5098fe5c6b619af7fc6c9cfeba01e75ee5701000000000000001ec005e9ca3c15b2994641dd22efcbb20032f10894f76f57296d219dc149817b0100000000000000a07f151db53097c2da9dac4b2e0f194931a677a3ba99df0f3976e34409fd64760100000000000000d8faee17dcc461acb22ca1720b86385414ea8810ba31509fbd8da8733029eb190100000000000000b071e9d6b444a555e034ecdc4d04f2528cc36b347b231b33388564a40fd32b2c0100000000000000f820a8ed2c97f639fea2892d0a89ae98ffc4c0054f948f9a0108e4d99f89994c0100000000000000fcd5f4c4fe11f20ad99dc8345b7dc5600caba5d5b7d3f499c3253c095152d45401000000000000005eac8ac37c95fc11921839550a30ef071bbc80fb10ea1482cc67818e184d544a0100000000000000ea2b17bd1b69a7b442dd000db0f12f0bd4bf7a87a540427986bd32f3d3bd55580100000000000000142445d894c1236a38c6b1bcd9f5a7245897026424ce9544002008a7702c3b1d0100000000000000d6acabff06fe9a6ccf02f780f33902672fae0f038d8e19ee234ce28a0b6a01410100000000000000f894d159aa4b63402119985e2243e77fc35787fb086867659412c8c6918b2a670100000000000000780e4353aca40b0f2b2403c862cb33032d49a820244bdc2853ce158d48c4f61001000000000000000e2daa2ef7884bdc7ca5f843f4f33f070c790e9a19d314bceefd04622920216301000000000000003e8394db87d36ddce56bfe0b86922dcc9a86d1ba061600e22d9694027b18c8400100000000000000c60a9f5f89ea3a56499bcd39bac7e038c25f5b7720d873fdc12b68d2531eb650010000000000000040b77fd8fcabe868dc7f2a08bf14c67e4d433886c3cd3738d1b0b9c649bafc230100000000000000cef0feb2602582b96fec882181d34bd5504645c544c983b1a962188239eed90a0100000000000000b633c47d126eceb0e36d788370ebaa179b0c7a3a21cf5f1421bfac40c895ed3c010000000000000092ee092cd2215c7c1628086c08be10a3cb969f6b276f600422f3526f303bd878010000000000000024190e384934261c444897054262813c65a73aaf371806db97762e995e5b350e0100000000000000020d34131c7a0ab6d104839ed8b9e0cdf075b80409a36fbe94d0cf83f7ea1f1e010000000000000022333a4409728530184f55b95171d2ddcec037603382fc7d6443b1f7b96c813601000000000000009acfd215519f40156749868afc8d56e015759f71cf183fe68382e8c02c75b2510100000000000000f44b3ec5c7b2188f208d60d159d1f5b0914a51a0632eacea6b88ec7b26d6673d01000000000000005ce79c3ad8a0e1806e863f0858c28a81408d19870a62ac0316b3e6345cbb5f76010000000000000006451fa7b2d831264e40a3e5b8452ede10164b7162a0e93bb9789a102c3010420100000000000000b672ee2f0f9183585ac4875368a0defda6d3c81927fbfc34bbacc7481058cb4b010000000000000022a66dd6397c2631df509db3482baac28b546729e6ce965472a9ba2e648ccc74010000000000000082bb250beb58df1c5346dc5dc26dbc38647a59fcd5c220c41466606cd855a2520100000000000000767cb742c94b22fff80da70a4ea77069aecde7ded53fbf5d957b01196924cd2d0100000000000000a065f45a353f24ba187248aacd9c64d5c3a92ddf92b4a5c33994f56a07cea840010000000000000078c91c4ee02089ea86612f66d6022a0cbd54afe470a162a72036611623924f6d01000000000000005432de09683010f3c1a6a977dd0dfdd8c5ce9fdb85225b9b7dc8e451e340cb240100000000000000464cb5dfedc6938caef6caaf5a58f4925a295f24a4f37337033dafa0cc733e66010000000000000016f34c9e6687012c42f9c02de75b9499849fe771f2ad2e666f965dc6627735540100000000000000f60b5e74957220ed7664befb71e9621436e40f2b6c1bdb1c90a6de9c3540a84001000000000000002a98fbaf7ec22832522e3f96821711ef684283911a524960efb14953255baa2b0100000000000000fe0af833307f4cff497d006ec63385b1c191efd6a4547fb05a355cd23686dd0401000000000000004ed5f55ec45727a57e2d8d6914f6d2acffb17b9515d347ba045067502a0b140201000000000000004cb98af1a70e917453f5dea682917e7b3077ea9d41dda7764433258a9d5db54b01000000000000002a0fda136ae348db338b87bed349145a94ce091227774b0542e533a83d1ba455010000000000000036c5a061b47768957b2b939b2e37e4cdf8825a4abf963c4f912f3ba4cd567f1e010000000000000076fa252aeca5b108fe76ce12e395ed8105d5c98e4abae38bfc7cb4fbd4d43d5501000000000000006a5607bc375d7ac0908e7643ea2e89dbe42f4f805c2fb6e2a22d0385c1232b310100000000000000f4ccdf83d734edcc568462572abaf32d22ac7faf8000195e02273d1c9665430801000000000000007eb2b0b6adbe5a5bad38f46db207f94c896d419661f4ab8f21e302a543df9b11010000000000000048ce0aba6f1554e139568b4d2358d6cca9bc291d3600787cc3e732291002ca2201000000000000007a07e4b6b4daf45f4af2a98e7458034447ae0e67e9a22596848e58d4ba73b9530100000000000000fa30595578d5e253a0a3701616665cb205fc02eb560c023454c280bfc6cd8d090100000000000000c4c5fe47a568c2fe4876eafd5e0093dcc31b450eb87bfe58397dfae2a590d4650100000000000000c670e2b0f864f126be43807610aab3295cb4ed6a684d95de331d700f74e2985e0100000000000000fa5a4da949ce29dd0fc20fe56c40d63ffded8e2dd88844f725efda0814ed526401000000000000001cc40fa83cd0a4431aa63315b55c669370a4037756089f3402a9021e2d8066640100000000000000742c0a1ea78a09c7454b48897bfde87bf4959b89c898623c8eeace7af714147d01000000000000003ce775a4a6215dbfbdc2b0a8a8b71936abd61642b5fd1a0c1d06ba548ad3025e0100000000000000bcb998778b7c2c182f396b311f92ae1289daeed9e62a3d8a8298b8dde7e1a52401000000000000004a1069d2203a75cd1078c39de35c16a6c4c12acbad34f1cba8efc065f80398610100000000000000cebdabff22e607a75aa8db1bf875511a563200cce3f089972aca719649b6e176010000000000000062c6c1f6f2478ee092c958842ac4351973bfeb49f55e33b8415ac0296a967b5f01000000000000008a6dbf87f769167b4eb982f63b946f96a1f223b6a6f2789183fec09581b8e906010000000000000056927fdc8bff2063e108fe1b05bbde2f6219bda7d8663fafcf3d2976c721535901000000000000009a64daca74d14dab93385e52ca70940732a8d45ae4b853ce156c3eeca06f0c5f0100000000000000eed7e8e8a64dfa89c548a31c1b9fec7af5aef4dbbdb26997b2ddca72d4f8790c0100000000000000fa49d3457520dd98ca1489b78354d7d30a9bdf2181140072ebda1c3dc3371e450100000000000000fe5ba24461a8be22c5e553d2715748ece9c50a621d1794e36ad6c40dcd5d9c230100000000000000b2ddb9eab0545b9ac7a46e37d6fc4605c34227d848416bd3637da7156efe612601000000000000001a15acd9aec8d1dd06c7b6a46be298c3fc2ecd51be6724a63da4da286e306f72010000000000000078cf1debe3fc0da2ed2473d1e1835a478cc3e7008e0cf42043f287bc36804b710100000000000000f853a1534a3af56217661420536dd7bea0db6f6db843d8fead77c308ed7dcc7c010000000000000032e2c97e308c84afea4b37d7dd8f62e67763126c357c9e6e49b27f54c3702b73010000000000000050d2e3ed042861cfddfecfb31d47caa1927064cb0372213a3015b2acdf1dd1450100000000000000843778dfeddea10578fab2773f2827c62fe0efe374d9a01eb370bd8f1427e7630100000000000000140fbeeabfb02dede7214a17c2cf78279d076c80d962431f35d1105c87b8d95501000000000000007cb1f225b90c00f426c33ac4338eeb2dae6467b8a9da5c1556e6588c12ca977b0100000000000000b261a66b9bae17b65e7f6a88d65efb4519925d6c418c9e2ba17bfdbf684b776301000000000000009c5d3bb1387f53f0306bf7f24e81dafa5bf972048de867e2e517938c4ebdf7120100000000000000560c91919fc22867159ed77bee1b3e70d2e222a5fe6e830fceb13b58b0daa5290100000000000000e03e94cd4419d9cb8709ad2859e598912c78c01b15eed53ec0c336d8d6c491420100000000000000ce60d2c987bbeeaceff8463484b717ce80cbcf3d8f8b2102e95effc88000d95d01000000000000003227028def74f8ea7bede3e112e4ce09d8fb823790ed599f2259019945f2690a0100000000000000c686fbbc968476537924f90aaa4993eef8314685d150228c462f8ae4e5e1e57f01000000000000004ca838afa9f12e88436eacb5024f3f94c95a66c32e114f65f3136176e426c75501000000000000000c60356c02d5d99293952c478fd07b2cff982dbad863ebdadf25c9e69206f14901000000000000003a8b589c8222ede45b3d95c8d9176543ffa9a29cbfa0ba2af60fc412e732d75e0100000000000000a43b19f13ec057124df240aad303e969f7d02fafc02c263d7ec814b6729d1b2001000000000000000884c85734b971a88cd94d86d3c62fdf163256a0387e15e2d36d8f25523a77480100000000000000f2cd13ba1efd67dfd5f8c9150b1a74d1ed1bad1a72c36fed96163b062e463d0101000000000000002001d47fbff7291a50650047b27cc47f1d22a0bdfbbfb0b8b7a6e8bbf350bf620100000000000000ecf0297bddebd3d766ea7def2bac79ad6eb650fabdcd029b99cb1649ff7dc8150100000000000000121f9d8ba85d89e3c6f9a0fedcdfc9b05cc40a6d3324eff6e8a58aec5f52590501000000000000008a16fb5a6718a714296cb8fa2ca708f677f78c7f883ba3c5ad1bbb9e23f37705010000000000000038c9a0897d9caff03a308d2120bbe892974ae8cb05f1cfe8b97259f0ac2e852901000000000000003491cc113ef8fe1165bb10e65cbb461955f92f8f0d82f2dcfe6664430dab853601000000000000004e466f6a4930d856a1f53f21c1a44451ead20c8c71319f6a685f0e254d24c32101000000000000007617b69110c43683b5000788259be855890c474be8fed65d7b1dae1d534ef85c01000000000000005e0fa84f762f7d6e4c4b0c18a86e1b7da6cb4fe7dfcf6b5c0056a7ccd8eb201401000000000000002037d70f4c244c81422409ad01d28d72a30d26e595fbcc791daeb57f78a8567001000000000000003cfa50228b841c7d2fab03db7e4bf282cf14e127ab9b31c23fca1a79be54e823010000000000000088fa8bb07ebce99964718c65d0d6f1b091ef2f4d4cdf7b94a22c42c007ecd706010000000000000052ac28ba2601723d23a086b5d775f19319f110ba5e9292f2af461e71903b5b50010000000000000002a4b2935b657f9ec563642ab0f34e223ef594cc70c856b9bd70fbe0837215600100000000000000c280e82e46ecabc4d68169e292c59cef96432f25fe849b8a147db5ca0ce7e17b010000000000000092e5bb9d0906f768dbdde0696b78e493cc78dc1f68789575b24f0b962799b51e01000000000000006ca32996225021dadb0b3f22460db6ce243faa3a0df7b33ef28e5fbcb9cf6f2f01000000000000004a512ac212da2c96d7bc8590865ce627e6b60246700595bb100b240e80a3f0760100000000000000f0c0cc64f8973ebc2322273e684b4f73f412503f124c130be0be1589718cdd780100000000000000322dcdf3a5f50091af8b876983da0e0e98e358339e6033cdb865cd64995f86130100000000000000b63f9ab3a147d76614bfb688751f79fb9a120d40af7ba3bb123c1957b91a411d010000000000000010e37a12fc6ed768d1a2d33c8abc6db675381dfe69c832abb77d9ba2341b3c4a01000000000000003213885ba6fd707b0716aeaad959cd824ab2f854e55963d9e69af006d194d51f0100000000000000fa1b0afc9ce9e9742c4825890f6d93bb87bd199e55e86ce66ba7c34ce43e273e01000000000000008013bf5a25c703e64dc4ae7e1248c0f2c7abad9e43672d82611d109740199856010000000000000004ea82190bfc6f5f845f2ba785032a5d772b1cb44b3023c18af302f626e7df190100000000000000188d1a45dca0c370ba6b7952ba682570fd4f61501c4dea9826a981374a3f815f01000000000000004c1dbdaaf0fb061228d2245561476088bc608788cb3e9c5266f5a8e54bdd1e670100000000000000d23c53a531e356646133db73065cd83999693a5bdfc05931238434f5b031522f01000000000000006a40a8b74a142958efb2d75cd363635eccbfb70cddb24f0626d0ec927d98233801000000000000005e127fe875a9c6396693b778833a710b0426a4fc0af4af490e7ff0a6f3e8b61f0100000000000000aa74176b5870c97b754a157ec0d8032148c2ae717a905e0e5e626048b6f5334301000000000000003e07b075219fc7ace8dc3bf3a06f5dc12aa9c7e45fe30244d2284bcfb1e6ee190100000000000000a4a0bc81aaad1ebce3fdf896a8d6d081ab93efc2de9d5c56f2632edfeaa7ad0f0100000000000000465242c8915eea46e25549f2ab97cfe78784f25083e51773e07d5a0cafc2de32010000000000000022376791bf19fefac611324d27bc6acb4b7f7eec713c186adbeda5a1e1b88f340100000000000000bc8f93a45201992fa9d04355095d03adeb5ff1aea206425eae4f902ffd47fe200100000000000000288c08430a7e427400dd5b61926b74a82abcbbc91ac739190cc791a581f6836a0100000000000000eec1df2a382f2f9d0e7dbd91ebffe7be19dc9e01159cf3b82229a3ad2a33685b0100000000000000fecb15325d9baf603112dd397d2e83d3694414f529d75c4b639c7e775b979b14010000000000000028052d0b965ed862b7861aa7f3f91fe52ff8b0f795ff476c7e0a7aa42e79933001000000000000001c860d36fc84a54978d99ad400a719dbbef493f8631856e6def3e9ec998cde3e01000000000000002ef781a1d268b8afb0a8331ece83f3fff6877baa2d06ed9a23d484d5d70a5003010000000000000092cca18f264bdcfc19e5c01515ea9d61a0bf0b4e46b2bcae372a428b9dc35e390100000000000000e0b770b1bcf7deb030ee75d5bad6ec1ebfe06ded0fc406a8520a9650fe832330010000000000000066a5a598bd5d484fe66e630a3e57f3b245fe0413f81401d7a5d59aeed1a3a46301000000000000003622bfbaf9350b5906bdf9ce362e06726224ed141c5d29e8e175e0beedbd3d3d01000000000000000469db5710f30dc9ed7411417170efd62ce8bbe36ccab6df758a94aa7b7f720b010000000000000008e80cc5ada5e557a1cea3658402bc83f9892b5c4e112b6e157e6e7d3663c47b01000000000000007836067da2bc290dc3c428c548a4dbebfdeddbc10a2db206abb6ac11741dc63e01000000000000006ed90090a744a0d55adf8f8af5af4d5198bb67220ce33fe71121d7c51f27a4130100000000000000bc20aa968087f7c0d4bb35dd9c502db39fd7f4596a412880fdcd5ddba22fcf460100000000000000ea82745d9978e47fc6bb25fc01383aad42aeee65662b6af304474f0e4101b06f010000000000000072f2ff3d21f4126e217f10f9d9bd18069c12eaab6922d073dd5241ac718e91200100000000000000f25d3265659fca9d24ca877823644f1223714b0167d0a676cf3c9c447173d12f01000000000000009ab493c4c8007f49a3e7d1e9f1aef39b39cd66a496e90486e62664725c6ba06f010000000000000094cc8c46f9670417f5ad9492d17189c4e03e96122782e92824f05e176d6843790100000000000000369a7419ed7884aecd3cda7ec3576942cacde7a9b8f2fe9a1115be827e2ba83b010000000000000096ef8b525c38b9a74a3014bd99979230dab2f20221e8c7d1db50c7a61a02e97e01000000000000001827754b7465edb9bf4ce981bdd3a33057f9450fc895e39654dbd51c3ab9835a01000000000000008c45a06f479923e10cc400ae1600234f85906e26195bde9023350efaf0bc622c01000000000000006053f4e41a4db1dd6ddcd2304b62de45cda832c4e63a831ce9e634fab830d40d0100000000000000f2065428f52da2f7a881f9b94bfd38719bb6e5ff88a6800bbb3aebb1a9ad21020100000000000000104b3d784f0ae26bf3268fb7342a99fcbb1ea61068e03337df050ef2e0895374010000000000000092006149452119964a75232851f01361608dc0a52031f240e93e70e98a3ff21901000000000000009ad36892ec05281de9c63c7cefb3f31e448957a9572e650d9f3af1f21b2f515e0100000000000000bae8e68bc8f1b66fe3229ee72d77137b394c6b7dfbf55e424f9d2c82d5c99600010000000000000098f7988d5a74a0e52f58dd3d232ac3e93ff757480db9d4c12761b04fef032c460100000000000000248cddedee20dbb65f20a1715c2490c09241f6800b72d0c4029a1c234f2ce74b01000000000000008ca0a873b2685dde8c4792832cabe50ea5a1f8a9a661a336689859319b66ba6201000000000000001cf3abc7c9d8027488ea2f5f2463fd091b194fbeeebf560875e8648fbc67dc24010000000000000060b521110672f6f871978fd3ac4a835b5e30c3fa727c04c70dbc543fcad38b0e01000000000000001c103b038f0515bb77061128200e1f117a531cb4474cf5f9430535345f54196701000000000000002ab0b5cc358184be4fa29e7a3dc24806a72e55baad40ec9a117324a884242c2801000000000000005afe620da258a48f00c3afbb8a98161e977f076c7e7f8392975a4f0db4b57d6101000000000000001ae9aab4a890c558ac8ab90ccbbf193b3841083670ebed278b2161fa2ec7b3040100000000000000c2d156c96e21691a06cecd4a396978f94cfb3a1760d41180efe382b7ce8e993f01000000000000004616ac86f0d45899eed3f1246dc5744858a694a92b0abd9f10e52dfc9c2867460100000000000000a4b31af719e5d9c3b69326ef920736e8b620b329eade475ae23a33fbd445df7201000000000000009281394b5d35827c826e1d7444f346c247b9a004aa0292a9ca2b16e0fb55687701000000000000007e88cd54f47c1f4ddd9d3a198fc689d24a523fe186d526b14e476f14ced7db3c0100000000000000e6a08fa6af54d2308215f4a62d554dd5b82deaec8ba22a2e6ebade7202ab9e210100000000000000a2259245fb5a7251b99ee8f307b97ec6e7f20081c1f75284aa9b433153d888160100000000000000068245d8a483bdbd4e9d88b49e17a651ec168f25e6851fc52c2e36a516031d5e0100000000000000386bcf52f4c464e6a18169f776d69e90880301f01fcc8cc0ba451f1d7e6c3b7c0100000000000000dc1d6d9b878558829a87267a578e1d044b2033888074dcc3a9fcd69cd5e60d3e0100000000000000b41546275611fa185c88c7016e909222b3a757b476316766a72729d074d8e92b01000000000000007e0da5500e4e91faec6b7c3763c52058a7a9350be3009f2fe00a8e3bf0c59e790100000000000000a8d082a4289fe5ccaada604e70c4b1473d6fae4374663672e61474852c1ebf2a0100000000000000309ab613bea03c4431f7602c937f5a4d17e2102db6fc7f77e32f7a245041b90c0100000000000000e0ee8ff76b364ad2ccc3e82e69cd700c0895607a449c5af3745bb3018a1843220100000000000000c322115db35bcba5a2c0755dd59c0278ef7f91ae39592cd8a98e481d64604428010000000000000004000000000000000264de6cab75353df51c9bc549ea19c3fd6bb2094b10745ec5aa63db9576b9d15de4563001019d20000000000000739efe10000000006009000000000000a50432904ec260963195582a1d339f9fbd2d5d76f551160105c922423cad0d94482f010000000000000076441c448aefcf40a72128edc9b44a4f7ef9c267c503e98f5f9c72d5e9e92f000100000000000000526e055ade4ac425e9b5f93ce4394601335d3599a5b742603126d78ce99a4a540100000000000000d0e8ddfdeacd8e163b01ca4da1a4e856312b0de412b492247070f2721f7d803801000000000000008008c1b7061a2402634fc15d3849e2913863beb9f55024bc8cc7fa7d6e397817010000000000000024a51a9bdb67213626d1b52bd8dbc0e9b94ea88ea417aa17b56212d1cea3e1780100000000000000488d520146f681678e9d229f5e29354edf65e521246b28a4175c0502e060b9200100000000000000c681c1acaa82eddba6e394ddc9a2fd1af34418448d544c34966a31c837667f280100000000000000ba395fcb33327501109ed40712c7a372d25bf3339edfabe2a1964fb7b5d4d82401000000000000009cb389c209afbebda2b12113e0266b3d30f46e2a91aaf4451c193d640288357101000000000000004c9886e2e62ee92a6778d6a7928052732044b64fa61969cd8e37f3f7e3406f720100000000000000c056f1879c1fd443e38244c26ef138218b3e43e70b1cb84bd7242e354cc9ee0e010000000000000026db7c5786fddc15f7e96905024905d877537451ed444cb97d3786361a59f64b0100000000000000c67b1b3084dc3eb2cc7a3cc4f742defc21b733e787737cbaf3b146a052633e0f01000000000000005237e4509f24bc9e8bf9bfd78b594219d86853ae16601f692f10c9b16b88f83b010000000000000098192016f83ef2fe74dba1ecc6526efc61b79f3177c00dc7c053160391858f700100000000000000a6f10752adf745ad55866031836194ad027ed8d6710d9853ef62982bcf45fd0e010000000000000078c35105ea4cd9d6ea0ba91b2c19e78f60931bef5918c1bd2e14259229e7c330010000000000000006d2846642c835b0fb1ff1ef908449376aa8e7c0f3352e55da9a1e97e9528b230100000000000000f8a681118ea0bb9dfde2813ce5144eeb5cee881c27883de1c0c759255ec32654010000000000000000b84e6e296de1009aeca95ee09bc5173aec6e91b1145b247d69e47758878972010000000000000090d25f2368ee57fb5c100140b7507d5831fb035e7632c53b532b65e6d14ba8480100000000000000e67c524e443cda4cd27dfcce70488a5d23a93c8c46a5e83ef5a69eff3a02fa5a0100000000000000a42289d68c963358f3c450a850242bb53121e73e17f0e2ea2b93327446bea33c01000000000000006c50859d9dde209012eb3868c1a3a6e80ae8fa528ace9df68e92dbbae60368200100000000000000a8e470f2339e3ed0da456780dd9207e9c6a02459238ec3057a6ade01fd6cd60a01000000000000005c7f05d77f853f3eb8d4989fce36d0808b6d2b881e26f13c01e939b5d489a57d01000000000000002addf696d5a42b0a3dada689731e00c991db936909df869ac6600662abc35310010000000000000072ed7192625403acef94aa9189f9f179deb89e60478816ca96c79b742f757e750100000000000000b4ffe3c5959ff37c11c6f19d91926cb97aa4bf0f604919e1753bb55664d061680100000000000000bc4c9b5425f9a2aa09e3239332c702dedbfffa2b9f4cc1b978b307fc1fa1337c0100000000000000e07d5b19d98a6f8ef5c964b507fcd88f500a2a0a9afd5cffe9d4e3f74d83b27f010000000000000024532b17fc5fb786660c52aeb03150799165dd05e88ce359189189a4b771f51e01000000000000008610e1f00a1eba67d13225867c1f2972e60604e49bea7e5c1b10b29d4841b84a0100000000000000be18787b5177e58664cd893fdaa20a3ca1bc9f1acbbb15036b046ae49c17c15b0100000000000000acef6dc8da16677955c38451be5a1b369fdc3c20bc249a1aec917276dfc2da580100000000000000c49cfd152ce3ac1fa142b3b6e720cb173eb7f43c82f021418253a070036f870c01000000000000006ec27dfa7ac9d35eb002c55d3e4d56b4df928dd5c44323ac228305741c9e09360100000000000000b89cbc83a386d6f5d4fed93289ee50fdf69d77369ca0c9a8b962554e3fc0d37e01000000000000009237113cf97fee5fafbeb82de593f6125e9c498bd59f0369625f46b326c7d9170100000000000000722d7d57085c250af633f2d461874d59aebc8021eb1112ec8805db5ddea53e5a0100000000000000a20797f3a8669a909adb22a3aee2844dba82d231cc33f5d9be0e2c533cb82a6701000000000000006a1274b6748bf822ba80c9a9416abd3cf591b7aee6adabb8359b7dbed8ebb3770100000000000000dc1274e0689c7a3eac31b41ce352719529e65c01f26999f74ce17c9905fce87401000000000000009c9bc1074cf465c0dd39f74bfdf16a67f81339ba2ad117a0c7030b4f0678771701000000000000005c0494412a296a92296160ac510697d97288753829a5e9d02eafb5f101e60f510100000000000000d8b38c77823eb1912bf8b743cca6c655ea1844ee468fbd78b394bf222bf8bc2001000000000000007251d6c376064f07f27d2532b05c091bd0978067b078c9f8d9984fd4216bdd4b0100000000000000487c6aad1cc26893dc7e498916a4c23d303f098c04b0a8b0c8242fbb7e73a16e010000000000000088f9a16886165d00612032cb1b36669ad62b7325536f499191e711134c71b6070100000000000000bc4b95226de4e10f91e0254cfe4541232252deaa347f567df124aba81bac4d3f010000000000000032636c64cae326ea37dfa4ddad688feb9829ada7a7d580a91ce03a50a673d01c01000000000000001eb833e31087d6baffee4e7f1d9a8e3b7013ea392c81f74313a354ba82e92f6b01000000000000009c8c7c8c91df0ed53864f69017d530b5ebda3ab4bde3c67027e70893213d533a010000000000000018ec239eec5457ba11a41518e7c5f98266d1bdbd67602641d04706f95dba5c560100000000000000c65c0a74887e9fe5cc56696fac7e7f5f1cd4a68f9661c8384b300bcdfbe67a1801000000000000003690e6ef639f685849ed93a6386d1fccf026c3fb64520940aa46af97f929e112010000000000000028a027ca1c0bdeebfc8fce85ac4bac48cc072523d9c4a86b4f2594f9142e7e3b010000000000000042e4c41a899dfb238649e5b17dc232c2699353635d60e6a3bdcd71f9b82cda300100000000000000ce4bfd8c5611b1637066ef9e579c85efadfc9513b882184e00b75871ef7f5a2d01000000000000005c0419f37036f2bf999f3958b49f63ab19d6dc19847a393dfd26cf303fc8d911010000000000000028558e46037c51ece4d39a8a4d34688662e629413c221d6226afe454240e70210100000000000000ee82f2670e36b9ad136ae1ab1607c35f3b49a8c93b86802c06df3ca62a2e3561010000000000000024a0c6db2090170748a7bae71b6f77b5dcc14c6acc5c58e8de78d317ccafe14401000000000000004a2073ae31b3df10d285eae6a5befe069183c4c6a6ffa1b2bf432011d0d475200100000000000000e41b3ecad757b0a5ecbc6b29691681df25b3d2b5f1ea325b648e607a5d76cf0801000000000000005461977495f9c407a8d951e860a1cb2087592103229bdbd879629cc538a4182b0100000000000000b05ad6cde0dfc019d740c3f50b8aac16550ff4c197da19cf23b9293f0c5c39070100000000000000bc56c07cea21bcbbe058aedd2ced9fb4757caead55f96bda9bed1c9669c32b64010000000000000078e1a4fecbaac940c04e0b591a01ea66a574b5098852ded2810e3a534971111f01000000000000006ccf2ce8e149999a7bb996faa65194e60aeb7bcd1937c787f886fe979fb49e6601000000000000000e5650026c7bee4fa43a2c7fcdc3452daa10b0530863ec686b1d5ee4d707600501000000000000001e866bed92016cd2dcabe2d87fcaf8c1d7248255cafb9e10638fc3a2b476221b0100000000000000946071eab9c0fa1de9be2ad3c18041f1326faab41d84d9daf9f89c0daf9c0f00010000000000000082b820c5bee8ee77e35203dab387f3434b8502e5f1c35dfb2ad15b5c89d47b3c01000000000000001cf3446b4b5116a1784d92cdc5101e55a5fb91ed3d93efccd06b304a94362d0a0100000000000000c6d5dc6e1ec83491397390449d8cddaa88631e8855efe50697788a93de00fb550100000000000000220d3f26072ad42aa5ca04b7253284d185f8bf95650faa170cbda8d7a47ea84a01000000000000003a4b0919068523aa04ab29f1b49bdc03a176a4b93f9b5a7e6e0cdcc8318691030100000000000000b288a9832e07bef83c5a8ca72c5a5583b321672ba7c6cdd44a971f855d32d95c01000000000000007480edf84ab569e559dccc99b87ecb9ae9db670b45a259b7f6e618b063e43113010000000000000020bedd48a5965e2fc0e221bd164deecdee849eb69cb8dc63a37df80b50a3093b010000000000000026c4a27200f70748b52f7277150d2db7e192b258d5001412e42c62c6e3ee1e5101000000000000004628f93047462b43ec0886f2c7d7318ddad1764fd32af4f32ef0b2dcfa4b297a010000000000000040a2527ffa7d30d788eca127d435c8b5aa48972cda538b9a1627a57e85c8fa1901000000000000003635c55546f19bfe62d84a220c4396b1c9d71a1acdb2da917a82f0c1415a2b020100000000000000844b691aa95ff9a15b50f5e5f4f0e582db6621326cf18d7533f55bc27549497a01000000000000002254fb9324a6a9af450ce3a4f5ab25f55deb22161e520b2308b8aaff42e3aa7401000000000000007c4b93d862704aad434ab3dc2cbef824df738c5dbe1ba7b34daa38b2aabf7c36010000000000000028e972febaf463f22d1108053e7c26ccde1e6018d7c302985bc227557e0a663b01000000000000007c4f928b915062d9cb15e854a9476cddbf7126c9de2fd70f67beaf2ebf6dbc5c0100000000000000fced8f1dff4f6c6852b0d643e26ee532086e72be7aecee28d94d1d59b5f9986701000000000000004a905d0574cebf6e8d00d382b104fc8ee1c008f1b9ffa6fa5c3b67ff29719c0d01000000000000008c64cd873a53fec10c4624239ce35d31d4422e32a109605a162fcbf632427733010000000000000026d7422872cbf4d4918046f240a13a37219a272f4326b3f3bd1249829bbcd12b0100000000000000be6106f9217a1847af66de9510fdfb40514409556506ddc1c1a897818434125b0100000000000000da98e4363908fa4d7980fe5574ceeac74fae49bf77b3a191654c7731214a565e0100000000000000ae2e94f092fbcfe263519f950b5ade09c474258a4e0d5e62570d02b3f71d85480100000000000000bca6409d6d7e4f94ce797594db4363bb8bebd5387770aee0bb7663b36354fe2a0100000000000000b2518044cc31062ee50fa81cb6983f314291a0300865fa5cfe149829c5050d24010000000000000086c1922e4ed392d72e0fbc0ee28e7ec0a8ba2b33470330a606cec9a159a79626010000000000000036465f4be77147914969ea78f8e39610310679011dfbb6137dab12e18a687a5201000000000000004e8cc21504fda961cf1cfe78e651d033b10f8ab1a4a0c757bd4848a7f2827f0601000000000000004ad8fedb395dc0ed63e0edbdbd2d20555b61a46aa7cd751e4308335c277cbd6a01000000000000004c5e6997b6f186855b1f4c9f8ab2d6cea3da2e86445605ab89e5b5821e05bd3d0100000000000000a6cd7eca570e90e2efeeda8f1c09480884a073c66fc7c41b2464e11822b12f0c0100000000000000944ad19383a9ae136f4f11c15687923b9b21319efab021336a3e8f2bd5b5ca20010000000000000068508b2ca3e01d7c8d79d99f1bb06a93058d14f1061d5fed4df13d4bc30aa557010000000000000074f02ed037d28c883df643034a596e4d2a97a23782ee8483c9ae3429ede7e7090100000000000000b045bf0235bbe708e4d6918758650c9c7f9ab4d638e4a841807ed7c82ff7f63a01000000000000005c252543704920d6bea67453cdd61b464b001badf73a3ea3b9e9fb35b224947201000000000000006e7a78e9fdfe275f3e000382ba30452729970578258839db6c0fc568e20b3515010000000000000004734733edcd9cf662389208fb8ccb5f274a7db8187ccc53dc84250f8599d54d01000000000000004e1b48e67c1e62e46add39fa523b956946228ea0f08bd9d20ced798cfc9a0f5b010000000000000010fee28789d45569ac0c95b7287fc7c5f087d93516cbd06e3c074a392d86da300100000000000000faa6ae896c2d1040e495acbdcd8d90a02ccb17ba6e507efa2f7deacb3b28466e0100000000000000840290d318350bff32db3dcf6138b822cb2adf1dedf5bad8729471988955915c0100000000000000907ff7ac1e6c451d236c05c8d3f85640d9f9472d6a30115fc26135dae020e6380100000000000000c264fe63e84cd004530d2a3eabdde5098fe5c6b619af7fc6c9cfeba01e75ee5701000000000000001ec005e9ca3c15b2994641dd22efcbb20032f10894f76f57296d219dc149817b0100000000000000a07f151db53097c2da9dac4b2e0f194931a677a3ba99df0f3976e34409fd64760100000000000000d8faee17dcc461acb22ca1720b86385414ea8810ba31509fbd8da8733029eb190100000000000000b071e9d6b444a555e034ecdc4d04f2528cc36b347b231b33388564a40fd32b2c0100000000000000f820a8ed2c97f639fea2892d0a89ae98ffc4c0054f948f9a0108e4d99f89994c0100000000000000fcd5f4c4fe11f20ad99dc8345b7dc5600caba5d5b7d3f499c3253c095152d45401000000000000005eac8ac37c95fc11921839550a30ef071bbc80fb10ea1482cc67818e184d544a0100000000000000ea2b17bd1b69a7b442dd000db0f12f0bd4bf7a87a540427986bd32f3d3bd55580100000000000000142445d894c1236a38c6b1bcd9f5a7245897026424ce9544002008a7702c3b1d0100000000000000d6acabff06fe9a6ccf02f780f33902672fae0f038d8e19ee234ce28a0b6a01410100000000000000f894d159aa4b63402119985e2243e77fc35787fb086867659412c8c6918b2a670100000000000000780e4353aca40b0f2b2403c862cb33032d49a820244bdc2853ce158d48c4f61001000000000000000e2daa2ef7884bdc7ca5f843f4f33f070c790e9a19d314bceefd04622920216301000000000000003e8394db87d36ddce56bfe0b86922dcc9a86d1ba061600e22d9694027b18c8400100000000000000c60a9f5f89ea3a56499bcd39bac7e038c25f5b7720d873fdc12b68d2531eb650010000000000000040b77fd8fcabe868dc7f2a08bf14c67e4d433886c3cd3738d1b0b9c649bafc230100000000000000cef0feb2602582b96fec882181d34bd5504645c544c983b1a962188239eed90a0100000000000000b633c47d126eceb0e36d788370ebaa179b0c7a3a21cf5f1421bfac40c895ed3c010000000000000092ee092cd2215c7c1628086c08be10a3cb969f6b276f600422f3526f303bd878010000000000000024190e384934261c444897054262813c65a73aaf371806db97762e995e5b350e0100000000000000020d34131c7a0ab6d104839ed8b9e0cdf075b80409a36fbe94d0cf83f7ea1f1e010000000000000022333a4409728530184f55b95171d2ddcec037603382fc7d6443b1f7b96c813601000000000000009acfd215519f40156749868afc8d56e015759f71cf183fe68382e8c02c75b2510100000000000000f44b3ec5c7b2188f208d60d159d1f5b0914a51a0632eacea6b88ec7b26d6673d01000000000000005ce79c3ad8a0e1806e863f0858c28a81408d19870a62ac0316b3e6345cbb5f76010000000000000006451fa7b2d831264e40a3e5b8452ede10164b7162a0e93bb9789a102c3010420100000000000000b672ee2f0f9183585ac4875368a0defda6d3c81927fbfc34bbacc7481058cb4b010000000000000022a66dd6397c2631df509db3482baac28b546729e6ce965472a9ba2e648ccc74010000000000000082bb250beb58df1c5346dc5dc26dbc38647a59fcd5c220c41466606cd855a2520100000000000000767cb742c94b22fff80da70a4ea77069aecde7ded53fbf5d957b01196924cd2d0100000000000000a065f45a353f24ba187248aacd9c64d5c3a92ddf92b4a5c33994f56a07cea840010000000000000078c91c4ee02089ea86612f66d6022a0cbd54afe470a162a72036611623924f6d01000000000000005432de09683010f3c1a6a977dd0dfdd8c5ce9fdb85225b9b7dc8e451e340cb240100000000000000464cb5dfedc6938caef6caaf5a58f4925a295f24a4f37337033dafa0cc733e66010000000000000016f34c9e6687012c42f9c02de75b9499849fe771f2ad2e666f965dc6627735540100000000000000f60b5e74957220ed7664befb71e9621436e40f2b6c1bdb1c90a6de9c3540a84001000000000000002a98fbaf7ec22832522e3f96821711ef684283911a524960efb14953255baa2b0100000000000000fe0af833307f4cff497d006ec63385b1c191efd6a4547fb05a355cd23686dd0401000000000000004ed5f55ec45727a57e2d8d6914f6d2acffb17b9515d347ba045067502a0b140201000000000000004cb98af1a70e917453f5dea682917e7b3077ea9d41dda7764433258a9d5db54b01000000000000002a0fda136ae348db338b87bed349145a94ce091227774b0542e533a83d1ba455010000000000000036c5a061b47768957b2b939b2e37e4cdf8825a4abf963c4f912f3ba4cd567f1e010000000000000076fa252aeca5b108fe76ce12e395ed8105d5c98e4abae38bfc7cb4fbd4d43d5501000000000000006a5607bc375d7ac0908e7643ea2e89dbe42f4f805c2fb6e2a22d0385c1232b310100000000000000f4ccdf83d734edcc568462572abaf32d22ac7faf8000195e02273d1c9665430801000000000000007eb2b0b6adbe5a5bad38f46db207f94c896d419661f4ab8f21e302a543df9b11010000000000000048ce0aba6f1554e139568b4d2358d6cca9bc291d3600787cc3e732291002ca2201000000000000007a07e4b6b4daf45f4af2a98e7458034447ae0e67e9a22596848e58d4ba73b9530100000000000000fa30595578d5e253a0a3701616665cb205fc02eb560c023454c280bfc6cd8d090100000000000000c4c5fe47a568c2fe4876eafd5e0093dcc31b450eb87bfe58397dfae2a590d4650100000000000000c670e2b0f864f126be43807610aab3295cb4ed6a684d95de331d700f74e2985e0100000000000000fa5a4da949ce29dd0fc20fe56c40d63ffded8e2dd88844f725efda0814ed526401000000000000001cc40fa83cd0a4431aa63315b55c669370a4037756089f3402a9021e2d8066640100000000000000742c0a1ea78a09c7454b48897bfde87bf4959b89c898623c8eeace7af714147d01000000000000003ce775a4a6215dbfbdc2b0a8a8b71936abd61642b5fd1a0c1d06ba548ad3025e0100000000000000bcb998778b7c2c182f396b311f92ae1289daeed9e62a3d8a8298b8dde7e1a52401000000000000004a1069d2203a75cd1078c39de35c16a6c4c12acbad34f1cba8efc065f80398610100000000000000cebdabff22e607a75aa8db1bf875511a563200cce3f089972aca719649b6e176010000000000000062c6c1f6f2478ee092c958842ac4351973bfeb49f55e33b8415ac0296a967b5f01000000000000008a6dbf87f769167b4eb982f63b946f96a1f223b6a6f2789183fec09581b8e906010000000000000056927fdc8bff2063e108fe1b05bbde2f6219bda7d8663fafcf3d2976c721535901000000000000009a64daca74d14dab93385e52ca70940732a8d45ae4b853ce156c3eeca06f0c5f0100000000000000eed7e8e8a64dfa89c548a31c1b9fec7af5aef4dbbdb26997b2ddca72d4f8790c0100000000000000fa49d3457520dd98ca1489b78354d7d30a9bdf2181140072ebda1c3dc3371e450100000000000000fe5ba24461a8be22c5e553d2715748ece9c50a621d1794e36ad6c40dcd5d9c230100000000000000b2ddb9eab0545b9ac7a46e37d6fc4605c34227d848416bd3637da7156efe612601000000000000001a15acd9aec8d1dd06c7b6a46be298c3fc2ecd51be6724a63da4da286e306f72010000000000000078cf1debe3fc0da2ed2473d1e1835a478cc3e7008e0cf42043f287bc36804b710100000000000000f853a1534a3af56217661420536dd7bea0db6f6db843d8fead77c308ed7dcc7c010000000000000032e2c97e308c84afea4b37d7dd8f62e67763126c357c9e6e49b27f54c3702b73010000000000000050d2e3ed042861cfddfecfb31d47caa1927064cb0372213a3015b2acdf1dd1450100000000000000843778dfeddea10578fab2773f2827c62fe0efe374d9a01eb370bd8f1427e7630100000000000000140fbeeabfb02dede7214a17c2cf78279d076c80d962431f35d1105c87b8d95501000000000000007cb1f225b90c00f426c33ac4338eeb2dae6467b8a9da5c1556e6588c12ca977b0100000000000000b261a66b9bae17b65e7f6a88d65efb4519925d6c418c9e2ba17bfdbf684b776301000000000000009c5d3bb1387f53f0306bf7f24e81dafa5bf972048de867e2e517938c4ebdf7120100000000000000560c91919fc22867159ed77bee1b3e70d2e222a5fe6e830fceb13b58b0daa5290100000000000000e03e94cd4419d9cb8709ad2859e598912c78c01b15eed53ec0c336d8d6c491420100000000000000ce60d2c987bbeeaceff8463484b717ce80cbcf3d8f8b2102e95effc88000d95d01000000000000003227028def74f8ea7bede3e112e4ce09d8fb823790ed599f2259019945f2690a0100000000000000c686fbbc968476537924f90aaa4993eef8314685d150228c462f8ae4e5e1e57f01000000000000004ca838afa9f12e88436eacb5024f3f94c95a66c32e114f65f3136176e426c75501000000000000000c60356c02d5d99293952c478fd07b2cff982dbad863ebdadf25c9e69206f14901000000000000003a8b589c8222ede45b3d95c8d9176543ffa9a29cbfa0ba2af60fc412e732d75e0100000000000000a43b19f13ec057124df240aad303e969f7d02fafc02c263d7ec814b6729d1b2001000000000000000884c85734b971a88cd94d86d3c62fdf163256a0387e15e2d36d8f25523a77480100000000000000f2cd13ba1efd67dfd5f8c9150b1a74d1ed1bad1a72c36fed96163b062e463d0101000000000000002001d47fbff7291a50650047b27cc47f1d22a0bdfbbfb0b8b7a6e8bbf350bf620100000000000000ecf0297bddebd3d766ea7def2bac79ad6eb650fabdcd029b99cb1649ff7dc8150100000000000000121f9d8ba85d89e3c6f9a0fedcdfc9b05cc40a6d3324eff6e8a58aec5f52590501000000000000008a16fb5a6718a714296cb8fa2ca708f677f78c7f883ba3c5ad1bbb9e23f37705010000000000000038c9a0897d9caff03a308d2120bbe892974ae8cb05f1cfe8b97259f0ac2e852901000000000000003491cc113ef8fe1165bb10e65cbb461955f92f8f0d82f2dcfe6664430dab853601000000000000004e466f6a4930d856a1f53f21c1a44451ead20c8c71319f6a685f0e254d24c32101000000000000007617b69110c43683b5000788259be855890c474be8fed65d7b1dae1d534ef85c01000000000000005e0fa84f762f7d6e4c4b0c18a86e1b7da6cb4fe7dfcf6b5c0056a7ccd8eb201401000000000000002037d70f4c244c81422409ad01d28d72a30d26e595fbcc791daeb57f78a8567001000000000000003cfa50228b841c7d2fab03db7e4bf282cf14e127ab9b31c23fca1a79be54e823010000000000000088fa8bb07ebce99964718c65d0d6f1b091ef2f4d4cdf7b94a22c42c007ecd706010000000000000052ac28ba2601723d23a086b5d775f19319f110ba5e9292f2af461e71903b5b50010000000000000002a4b2935b657f9ec563642ab0f34e223ef594cc70c856b9bd70fbe0837215600100000000000000c280e82e46ecabc4d68169e292c59cef96432f25fe849b8a147db5ca0ce7e17b010000000000000092e5bb9d0906f768dbdde0696b78e493cc78dc1f68789575b24f0b962799b51e01000000000000006ca32996225021dadb0b3f22460db6ce243faa3a0df7b33ef28e5fbcb9cf6f2f01000000000000004a512ac212da2c96d7bc8590865ce627e6b60246700595bb100b240e80a3f0760100000000000000f0c0cc64f8973ebc2322273e684b4f73f412503f124c130be0be1589718cdd780100000000000000322dcdf3a5f50091af8b876983da0e0e98e358339e6033cdb865cd64995f86130100000000000000b63f9ab3a147d76614bfb688751f79fb9a120d40af7ba3bb123c1957b91a411d010000000000000010e37a12fc6ed768d1a2d33c8abc6db675381dfe69c832abb77d9ba2341b3c4a01000000000000003213885ba6fd707b0716aeaad959cd824ab2f854e55963d9e69af006d194d51f0100000000000000fa1b0afc9ce9e9742c4825890f6d93bb87bd199e55e86ce66ba7c34ce43e273e01000000000000008013bf5a25c703e64dc4ae7e1248c0f2c7abad9e43672d82611d10974019985601000000000000007075de5f3cae26e005560440e9cc633c9fe8d7143b1fb8dc67e0d1ed7871e77d0100000000000000188d1a45dca0c370ba6b7952ba682570fd4f61501c4dea9826a981374a3f815f01000000000000004c1dbdaaf0fb061228d2245561476088bc608788cb3e9c5266f5a8e54bdd1e670100000000000000d23c53a531e356646133db73065cd83999693a5bdfc05931238434f5b031522f01000000000000006a40a8b74a142958efb2d75cd363635eccbfb70cddb24f0626d0ec927d98233801000000000000005e127fe875a9c6396693b778833a710b0426a4fc0af4af490e7ff0a6f3e8b61f0100000000000000aa74176b5870c97b754a157ec0d8032148c2ae717a905e0e5e626048b6f5334301000000000000003e07b075219fc7ace8dc3bf3a06f5dc12aa9c7e45fe30244d2284bcfb1e6ee190100000000000000a4a0bc81aaad1ebce3fdf896a8d6d081ab93efc2de9d5c56f2632edfeaa7ad0f0100000000000000465242c8915eea46e25549f2ab97cfe78784f25083e51773e07d5a0cafc2de32010000000000000022376791bf19fefac611324d27bc6acb4b7f7eec713c186adbeda5a1e1b88f340100000000000000bc8f93a45201992fa9d04355095d03adeb5ff1aea206425eae4f902ffd47fe200100000000000000288c08430a7e427400dd5b61926b74a82abcbbc91ac739190cc791a581f6836a0100000000000000eec1df2a382f2f9d0e7dbd91ebffe7be19dc9e01159cf3b82229a3ad2a33685b0100000000000000fecb15325d9baf603112dd397d2e83d3694414f529d75c4b639c7e775b979b14010000000000000028052d0b965ed862b7861aa7f3f91fe52ff8b0f795ff476c7e0a7aa42e79933001000000000000001c860d36fc84a54978d99ad400a719dbbef493f8631856e6def3e9ec998cde3e01000000000000002ef781a1d268b8afb0a8331ece83f3fff6877baa2d06ed9a23d484d5d70a5003010000000000000092cca18f264bdcfc19e5c01515ea9d61a0bf0b4e46b2bcae372a428b9dc35e390100000000000000e0b770b1bcf7deb030ee75d5bad6ec1ebfe06ded0fc406a8520a9650fe832330010000000000000066a5a598bd5d484fe66e630a3e57f3b245fe0413f81401d7a5d59aeed1a3a46301000000000000003622bfbaf9350b5906bdf9ce362e06726224ed141c5d29e8e175e0beedbd3d3d01000000000000000469db5710f30dc9ed7411417170efd62ce8bbe36ccab6df758a94aa7b7f720b010000000000000008e80cc5ada5e557a1cea3658402bc83f9892b5c4e112b6e157e6e7d3663c47b01000000000000007836067da2bc290dc3c428c548a4dbebfdeddbc10a2db206abb6ac11741dc63e01000000000000006ed90090a744a0d55adf8f8af5af4d5198bb67220ce33fe71121d7c51f27a4130100000000000000bc20aa968087f7c0d4bb35dd9c502db39fd7f4596a412880fdcd5ddba22fcf460100000000000000ea82745d9978e47fc6bb25fc01383aad42aeee65662b6af304474f0e4101b06f010000000000000072f2ff3d21f4126e217f10f9d9bd18069c12eaab6922d073dd5241ac718e91200100000000000000f25d3265659fca9d24ca877823644f1223714b0167d0a676cf3c9c447173d12f01000000000000009ab493c4c8007f49a3e7d1e9f1aef39b39cd66a496e90486e62664725c6ba06f010000000000000094cc8c46f9670417f5ad9492d17189c4e03e96122782e92824f05e176d6843790100000000000000369a7419ed7884aecd3cda7ec3576942cacde7a9b8f2fe9a1115be827e2ba83b010000000000000096ef8b525c38b9a74a3014bd99979230dab2f20221e8c7d1db50c7a61a02e97e01000000000000001827754b7465edb9bf4ce981bdd3a33057f9450fc895e39654dbd51c3ab9835a01000000000000008c45a06f479923e10cc400ae1600234f85906e26195bde9023350efaf0bc622c01000000000000006053f4e41a4db1dd6ddcd2304b62de45cda832c4e63a831ce9e634fab830d40d0100000000000000f2065428f52da2f7a881f9b94bfd38719bb6e5ff88a6800bbb3aebb1a9ad21020100000000000000104b3d784f0ae26bf3268fb7342a99fcbb1ea61068e03337df050ef2e0895374010000000000000092006149452119964a75232851f01361608dc0a52031f240e93e70e98a3ff21901000000000000009ad36892ec05281de9c63c7cefb3f31e448957a9572e650d9f3af1f21b2f515e0100000000000000bae8e68bc8f1b66fe3229ee72d77137b394c6b7dfbf55e424f9d2c82d5c99600010000000000000098f7988d5a74a0e52f58dd3d232ac3e93ff757480db9d4c12761b04fef032c460100000000000000248cddedee20dbb65f20a1715c2490c09241f6800b72d0c4029a1c234f2ce74b01000000000000008ca0a873b2685dde8c4792832cabe50ea5a1f8a9a661a336689859319b66ba6201000000000000001cf3abc7c9d8027488ea2f5f2463fd091b194fbeeebf560875e8648fbc67dc24010000000000000060b521110672f6f871978fd3ac4a835b5e30c3fa727c04c70dbc543fcad38b0e01000000000000001c103b038f0515bb77061128200e1f117a531cb4474cf5f9430535345f54196701000000000000002ab0b5cc358184be4fa29e7a3dc24806a72e55baad40ec9a117324a884242c2801000000000000005afe620da258a48f00c3afbb8a98161e977f076c7e7f8392975a4f0db4b57d6101000000000000001ae9aab4a890c558ac8ab90ccbbf193b3841083670ebed278b2161fa2ec7b3040100000000000000c2d156c96e21691a06cecd4a396978f94cfb3a1760d41180efe382b7ce8e993f01000000000000004616ac86f0d45899eed3f1246dc5744858a694a92b0abd9f10e52dfc9c2867460100000000000000a4b31af719e5d9c3b69326ef920736e8b620b329eade475ae23a33fbd445df7201000000000000009281394b5d35827c826e1d7444f346c247b9a004aa0292a9ca2b16e0fb55687701000000000000007e88cd54f47c1f4ddd9d3a198fc689d24a523fe186d526b14e476f14ced7db3c0100000000000000e6a08fa6af54d2308215f4a62d554dd5b82deaec8ba22a2e6ebade7202ab9e21010000000000000096e0b71982f3e7ba6ab06d28dfbf803caf4ac51b7633bee848f4f3fadc0dac480100000000000000068245d8a483bdbd4e9d88b49e17a651ec168f25e6851fc52c2e36a516031d5e0100000000000000386bcf52f4c464e6a18169f776d69e90880301f01fcc8cc0ba451f1d7e6c3b7c0100000000000000dc1d6d9b878558829a87267a578e1d044b2033888074dcc3a9fcd69cd5e60d3e0100000000000000b41546275611fa185c88c7016e909222b3a757b476316766a72729d074d8e92b01000000000000007e0da5500e4e91faec6b7c3763c52058a7a9350be3009f2fe00a8e3bf0c59e790100000000000000a8d082a4289fe5ccaada604e70c4b1473d6fae4374663672e61474852c1ebf2a0100000000000000309ab613bea03c4431f7602c937f5a4d17e2102db6fc7f77e32f7a245041b90c0100000000000000e0ee8ff76b364ad2ccc3e82e69cd700c0895607a449c5af3745bb3018a18432201000000000000005d9f86b7514745bf41299f7fb39969966e4b7556bc3942a51c95052f5233493901000000000000000400000000000000027921f499584ea60af4fc6c621d1585b79e3852fcc929fce53d68e7d6f5f16c8fe4563001019d20000000000000739efe10000000006009000000000000a50432904ec260963195582a1d339f9fbd2d5d76f551160105c922423cad0d94482f010000000000000076441c448aefcf40a72128edc9b44a4f7ef9c267c503e98f5f9c72d5e9e92f000100000000000000526e055ade4ac425e9b5f93ce4394601335d3599a5b742603126d78ce99a4a540100000000000000d0e8ddfdeacd8e163b01ca4da1a4e856312b0de412b492247070f2721f7d803801000000000000008008c1b7061a2402634fc15d3849e2913863beb9f55024bc8cc7fa7d6e397817010000000000000024a51a9bdb67213626d1b52bd8dbc0e9b94ea88ea417aa17b56212d1cea3e1780100000000000000488d520146f681678e9d229f5e29354edf65e521246b28a4175c0502e060b9200100000000000000c681c1acaa82eddba6e394ddc9a2fd1af34418448d544c34966a31c837667f280100000000000000ba395fcb33327501109ed40712c7a372d25bf3339edfabe2a1964fb7b5d4d82401000000000000009cb389c209afbebda2b12113e0266b3d30f46e2a91aaf4451c193d640288357101000000000000004c9886e2e62ee92a6778d6a7928052732044b64fa61969cd8e37f3f7e3406f720100000000000000c056f1879c1fd443e38244c26ef138218b3e43e70b1cb84bd7242e354cc9ee0e010000000000000026db7c5786fddc15f7e96905024905d877537451ed444cb97d3786361a59f64b0100000000000000c67b1b3084dc3eb2cc7a3cc4f742defc21b733e787737cbaf3b146a052633e0f01000000000000005237e4509f24bc9e8bf9bfd78b594219d86853ae16601f692f10c9b16b88f83b010000000000000098192016f83ef2fe74dba1ecc6526efc61b79f3177c00dc7c053160391858f700100000000000000a6f10752adf745ad55866031836194ad027ed8d6710d9853ef62982bcf45fd0e010000000000000078c35105ea4cd9d6ea0ba91b2c19e78f60931bef5918c1bd2e14259229e7c330010000000000000006d2846642c835b0fb1ff1ef908449376aa8e7c0f3352e55da9a1e97e9528b230100000000000000f8a681118ea0bb9dfde2813ce5144eeb5cee881c27883de1c0c759255ec32654010000000000000000b84e6e296de1009aeca95ee09bc5173aec6e91b1145b247d69e47758878972010000000000000090d25f2368ee57fb5c100140b7507d5831fb035e7632c53b532b65e6d14ba8480100000000000000e67c524e443cda4cd27dfcce70488a5d23a93c8c46a5e83ef5a69eff3a02fa5a0100000000000000a42289d68c963358f3c450a850242bb53121e73e17f0e2ea2b93327446bea33c01000000000000006c50859d9dde209012eb3868c1a3a6e80ae8fa528ace9df68e92dbbae60368200100000000000000a8e470f2339e3ed0da456780dd9207e9c6a02459238ec3057a6ade01fd6cd60a01000000000000005c7f05d77f853f3eb8d4989fce36d0808b6d2b881e26f13c01e939b5d489a57d01000000000000002addf696d5a42b0a3dada689731e00c991db936909df869ac6600662abc35310010000000000000072ed7192625403acef94aa9189f9f179deb89e60478816ca96c79b742f757e750100000000000000b4ffe3c5959ff37c11c6f19d91926cb97aa4bf0f604919e1753bb55664d061680100000000000000bc4c9b5425f9a2aa09e3239332c702dedbfffa2b9f4cc1b978b307fc1fa1337c0100000000000000e07d5b19d98a6f8ef5c964b507fcd88f500a2a0a9afd5cffe9d4e3f74d83b27f010000000000000024532b17fc5fb786660c52aeb03150799165dd05e88ce359189189a4b771f51e01000000000000008610e1f00a1eba67d13225867c1f2972e60604e49bea7e5c1b10b29d4841b84a0100000000000000be18787b5177e58664cd893fdaa20a3ca1bc9f1acbbb15036b046ae49c17c15b0100000000000000acef6dc8da16677955c38451be5a1b369fdc3c20bc249a1aec917276dfc2da580100000000000000c49cfd152ce3ac1fa142b3b6e720cb173eb7f43c82f021418253a070036f870c01000000000000006ec27dfa7ac9d35eb002c55d3e4d56b4df928dd5c44323ac228305741c9e09360100000000000000b89cbc83a386d6f5d4fed93289ee50fdf69d77369ca0c9a8b962554e3fc0d37e01000000000000009237113cf97fee5fafbeb82de593f6125e9c498bd59f0369625f46b326c7d9170100000000000000722d7d57085c250af633f2d461874d59aebc8021eb1112ec8805db5ddea53e5a0100000000000000a20797f3a8669a909adb22a3aee2844dba82d231cc33f5d9be0e2c533cb82a6701000000000000006a1274b6748bf822ba80c9a9416abd3cf591b7aee6adabb8359b7dbed8ebb3770100000000000000dc1274e0689c7a3eac31b41ce352719529e65c01f26999f74ce17c9905fce87401000000000000009c9bc1074cf465c0dd39f74bfdf16a67f81339ba2ad117a0c7030b4f0678771701000000000000005c0494412a296a92296160ac510697d97288753829a5e9d02eafb5f101e60f510100000000000000d8b38c77823eb1912bf8b743cca6c655ea1844ee468fbd78b394bf222bf8bc2001000000000000007251d6c376064f07f27d2532b05c091bd0978067b078c9f8d9984fd4216bdd4b0100000000000000487c6aad1cc26893dc7e498916a4c23d303f098c04b0a8b0c8242fbb7e73a16e010000000000000088f9a16886165d00612032cb1b36669ad62b7325536f499191e711134c71b6070100000000000000bc4b95226de4e10f91e0254cfe4541232252deaa347f567df124aba81bac4d3f010000000000000032636c64cae326ea37dfa4ddad688feb9829ada7a7d580a91ce03a50a673d01c01000000000000001eb833e31087d6baffee4e7f1d9a8e3b7013ea392c81f74313a354ba82e92f6b01000000000000009c8c7c8c91df0ed53864f69017d530b5ebda3ab4bde3c67027e70893213d533a010000000000000018ec239eec5457ba11a41518e7c5f98266d1bdbd67602641d04706f95dba5c560100000000000000c65c0a74887e9fe5cc56696fac7e7f5f1cd4a68f9661c8384b300bcdfbe67a1801000000000000003690e6ef639f685849ed93a6386d1fccf026c3fb64520940aa46af97f929e112010000000000000028a027ca1c0bdeebfc8fce85ac4bac48cc072523d9c4a86b4f2594f9142e7e3b010000000000000042e4c41a899dfb238649e5b17dc232c2699353635d60e6a3bdcd71f9b82cda300100000000000000ce4bfd8c5611b1637066ef9e579c85efadfc9513b882184e00b75871ef7f5a2d01000000000000005c0419f37036f2bf999f3958b49f63ab19d6dc19847a393dfd26cf303fc8d911010000000000000028558e46037c51ece4d39a8a4d34688662e629413c221d6226afe454240e70210100000000000000ee82f2670e36b9ad136ae1ab1607c35f3b49a8c93b86802c06df3ca62a2e3561010000000000000024a0c6db2090170748a7bae71b6f77b5dcc14c6acc5c58e8de78d317ccafe14401000000000000004a2073ae31b3df10d285eae6a5befe069183c4c6a6ffa1b2bf432011d0d475200100000000000000e41b3ecad757b0a5ecbc6b29691681df25b3d2b5f1ea325b648e607a5d76cf0801000000000000005461977495f9c407a8d951e860a1cb2087592103229bdbd879629cc538a4182b0100000000000000b05ad6cde0dfc019d740c3f50b8aac16550ff4c197da19cf23b9293f0c5c39070100000000000000bc56c07cea21bcbbe058aedd2ced9fb4757caead55f96bda9bed1c9669c32b64010000000000000078e1a4fecbaac940c04e0b591a01ea66a574b5098852ded2810e3a534971111f01000000000000006ccf2ce8e149999a7bb996faa65194e60aeb7bcd1937c787f886fe979fb49e6601000000000000000e5650026c7bee4fa43a2c7fcdc3452daa10b0530863ec686b1d5ee4d707600501000000000000001e866bed92016cd2dcabe2d87fcaf8c1d7248255cafb9e10638fc3a2b476221b0100000000000000946071eab9c0fa1de9be2ad3c18041f1326faab41d84d9daf9f89c0daf9c0f00010000000000000082b820c5bee8ee77e35203dab387f3434b8502e5f1c35dfb2ad15b5c89d47b3c01000000000000001cf3446b4b5116a1784d92cdc5101e55a5fb91ed3d93efccd06b304a94362d0a0100000000000000c6d5dc6e1ec83491397390449d8cddaa88631e8855efe50697788a93de00fb550100000000000000220d3f26072ad42aa5ca04b7253284d185f8bf95650faa170cbda8d7a47ea84a01000000000000003a4b0919068523aa04ab29f1b49bdc03a176a4b93f9b5a7e6e0cdcc8318691030100000000000000b288a9832e07bef83c5a8ca72c5a5583b321672ba7c6cdd44a971f855d32d95c01000000000000007480edf84ab569e559dccc99b87ecb9ae9db670b45a259b7f6e618b063e43113010000000000000020bedd48a5965e2fc0e221bd164deecdee849eb69cb8dc63a37df80b50a3093b010000000000000026c4a27200f70748b52f7277150d2db7e192b258d5001412e42c62c6e3ee1e5101000000000000004628f93047462b43ec0886f2c7d7318ddad1764fd32af4f32ef0b2dcfa4b297a010000000000000040a2527ffa7d30d788eca127d435c8b5aa48972cda538b9a1627a57e85c8fa1901000000000000003635c55546f19bfe62d84a220c4396b1c9d71a1acdb2da917a82f0c1415a2b020100000000000000844b691aa95ff9a15b50f5e5f4f0e582db6621326cf18d7533f55bc27549497a01000000000000002254fb9324a6a9af450ce3a4f5ab25f55deb22161e520b2308b8aaff42e3aa7401000000000000007c4b93d862704aad434ab3dc2cbef824df738c5dbe1ba7b34daa38b2aabf7c36010000000000000028e972febaf463f22d1108053e7c26ccde1e6018d7c302985bc227557e0a663b01000000000000007c4f928b915062d9cb15e854a9476cddbf7126c9de2fd70f67beaf2ebf6dbc5c0100000000000000fced8f1dff4f6c6852b0d643e26ee532086e72be7aecee28d94d1d59b5f9986701000000000000004a905d0574cebf6e8d00d382b104fc8ee1c008f1b9ffa6fa5c3b67ff29719c0d01000000000000008c64cd873a53fec10c4624239ce35d31d4422e32a109605a162fcbf632427733010000000000000026d7422872cbf4d4918046f240a13a37219a272f4326b3f3bd1249829bbcd12b0100000000000000be6106f9217a1847af66de9510fdfb40514409556506ddc1c1a897818434125b0100000000000000da98e4363908fa4d7980fe5574ceeac74fae49bf77b3a191654c7731214a565e0100000000000000ae2e94f092fbcfe263519f950b5ade09c474258a4e0d5e62570d02b3f71d85480100000000000000bca6409d6d7e4f94ce797594db4363bb8bebd5387770aee0bb7663b36354fe2a0100000000000000b2518044cc31062ee50fa81cb6983f314291a0300865fa5cfe149829c5050d24010000000000000086c1922e4ed392d72e0fbc0ee28e7ec0a8ba2b33470330a606cec9a159a79626010000000000000036465f4be77147914969ea78f8e39610310679011dfbb6137dab12e18a687a5201000000000000004e8cc21504fda961cf1cfe78e651d033b10f8ab1a4a0c757bd4848a7f2827f0601000000000000004ad8fedb395dc0ed63e0edbdbd2d20555b61a46aa7cd751e4308335c277cbd6a01000000000000004c5e6997b6f186855b1f4c9f8ab2d6cea3da2e86445605ab89e5b5821e05bd3d0100000000000000a6cd7eca570e90e2efeeda8f1c09480884a073c66fc7c41b2464e11822b12f0c0100000000000000944ad19383a9ae136f4f11c15687923b9b21319efab021336a3e8f2bd5b5ca20010000000000000068508b2ca3e01d7c8d79d99f1bb06a93058d14f1061d5fed4df13d4bc30aa557010000000000000074f02ed037d28c883df643034a596e4d2a97a23782ee8483c9ae3429ede7e7090100000000000000b045bf0235bbe708e4d6918758650c9c7f9ab4d638e4a841807ed7c82ff7f63a01000000000000005c252543704920d6bea67453cdd61b464b001badf73a3ea3b9e9fb35b224947201000000000000006e7a78e9fdfe275f3e000382ba30452729970578258839db6c0fc568e20b3515010000000000000004734733edcd9cf662389208fb8ccb5f274a7db8187ccc53dc84250f8599d54d01000000000000004e1b48e67c1e62e46add39fa523b956946228ea0f08bd9d20ced798cfc9a0f5b010000000000000010fee28789d45569ac0c95b7287fc7c5f087d93516cbd06e3c074a392d86da300100000000000000faa6ae896c2d1040e495acbdcd8d90a02ccb17ba6e507efa2f7deacb3b28466e0100000000000000840290d318350bff32db3dcf6138b822cb2adf1dedf5bad8729471988955915c0100000000000000907ff7ac1e6c451d236c05c8d3f85640d9f9472d6a30115fc26135dae020e6380100000000000000c264fe63e84cd004530d2a3eabdde5098fe5c6b619af7fc6c9cfeba01e75ee5701000000000000001ec005e9ca3c15b2994641dd22efcbb20032f10894f76f57296d219dc149817b0100000000000000a07f151db53097c2da9dac4b2e0f194931a677a3ba99df0f3976e34409fd64760100000000000000d8faee17dcc461acb22ca1720b86385414ea8810ba31509fbd8da8733029eb190100000000000000b071e9d6b444a555e034ecdc4d04f2528cc36b347b231b33388564a40fd32b2c0100000000000000f820a8ed2c97f639fea2892d0a89ae98ffc4c0054f948f9a0108e4d99f89994c0100000000000000fcd5f4c4fe11f20ad99dc8345b7dc5600caba5d5b7d3f499c3253c095152d45401000000000000005eac8ac37c95fc11921839550a30ef071bbc80fb10ea1482cc67818e184d544a0100000000000000ea2b17bd1b69a7b442dd000db0f12f0bd4bf7a87a540427986bd32f3d3bd55580100000000000000142445d894c1236a38c6b1bcd9f5a7245897026424ce9544002008a7702c3b1d0100000000000000d6acabff06fe9a6ccf02f780f33902672fae0f038d8e19ee234ce28a0b6a01410100000000000000f894d159aa4b63402119985e2243e77fc35787fb086867659412c8c6918b2a670100000000000000780e4353aca40b0f2b2403c862cb33032d49a820244bdc2853ce158d48c4f61001000000000000000e2daa2ef7884bdc7ca5f843f4f33f070c790e9a19d314bceefd04622920216301000000000000003e8394db87d36ddce56bfe0b86922dcc9a86d1ba061600e22d9694027b18c8400100000000000000c60a9f5f89ea3a56499bcd39bac7e038c25f5b7720d873fdc12b68d2531eb650010000000000000040b77fd8fcabe868dc7f2a08bf14c67e4d433886c3cd3738d1b0b9c649bafc230100000000000000cef0feb2602582b96fec882181d34bd5504645c544c983b1a962188239eed90a0100000000000000b633c47d126eceb0e36d788370ebaa179b0c7a3a21cf5f1421bfac40c895ed3c010000000000000092ee092cd2215c7c1628086c08be10a3cb969f6b276f600422f3526f303bd878010000000000000024190e384934261c444897054262813c65a73aaf371806db97762e995e5b350e0100000000000000020d34131c7a0ab6d104839ed8b9e0cdf075b80409a36fbe94d0cf83f7ea1f1e010000000000000022333a4409728530184f55b95171d2ddcec037603382fc7d6443b1f7b96c813601000000000000009acfd215519f40156749868afc8d56e015759f71cf183fe68382e8c02c75b2510100000000000000f44b3ec5c7b2188f208d60d159d1f5b0914a51a0632eacea6b88ec7b26d6673d01000000000000005ce79c3ad8a0e1806e863f0858c28a81408d19870a62ac0316b3e6345cbb5f76010000000000000006451fa7b2d831264e40a3e5b8452ede10164b7162a0e93bb9789a102c3010420100000000000000b672ee2f0f9183585ac4875368a0defda6d3c81927fbfc34bbacc7481058cb4b010000000000000022a66dd6397c2631df509db3482baac28b546729e6ce965472a9ba2e648ccc74010000000000000082bb250beb58df1c5346dc5dc26dbc38647a59fcd5c220c41466606cd855a2520100000000000000767cb742c94b22fff80da70a4ea77069aecde7ded53fbf5d957b01196924cd2d0100000000000000a065f45a353f24ba187248aacd9c64d5c3a92ddf92b4a5c33994f56a07cea840010000000000000078c91c4ee02089ea86612f66d6022a0cbd54afe470a162a72036611623924f6d01000000000000005432de09683010f3c1a6a977dd0dfdd8c5ce9fdb85225b9b7dc8e451e340cb240100000000000000464cb5dfedc6938caef6caaf5a58f4925a295f24a4f37337033dafa0cc733e66010000000000000016f34c9e6687012c42f9c02de75b9499849fe771f2ad2e666f965dc6627735540100000000000000f60b5e74957220ed7664befb71e9621436e40f2b6c1bdb1c90a6de9c3540a84001000000000000002a98fbaf7ec22832522e3f96821711ef684283911a524960efb14953255baa2b0100000000000000fe0af833307f4cff497d006ec63385b1c191efd6a4547fb05a355cd23686dd0401000000000000004ed5f55ec45727a57e2d8d6914f6d2acffb17b9515d347ba045067502a0b140201000000000000004cb98af1a70e917453f5dea682917e7b3077ea9d41dda7764433258a9d5db54b01000000000000002a0fda136ae348db338b87bed349145a94ce091227774b0542e533a83d1ba455010000000000000036c5a061b47768957b2b939b2e37e4cdf8825a4abf963c4f912f3ba4cd567f1e010000000000000076fa252aeca5b108fe76ce12e395ed8105d5c98e4abae38bfc7cb4fbd4d43d5501000000000000006a5607bc375d7ac0908e7643ea2e89dbe42f4f805c2fb6e2a22d0385c1232b310100000000000000f4ccdf83d734edcc568462572abaf32d22ac7faf8000195e02273d1c9665430801000000000000007eb2b0b6adbe5a5bad38f46db207f94c896d419661f4ab8f21e302a543df9b11010000000000000048ce0aba6f1554e139568b4d2358d6cca9bc291d3600787cc3e732291002ca2201000000000000007a07e4b6b4daf45f4af2a98e7458034447ae0e67e9a22596848e58d4ba73b9530100000000000000fa30595578d5e253a0a3701616665cb205fc02eb560c023454c280bfc6cd8d090100000000000000c4c5fe47a568c2fe4876eafd5e0093dcc31b450eb87bfe58397dfae2a590d4650100000000000000c670e2b0f864f126be43807610aab3295cb4ed6a684d95de331d700f74e2985e0100000000000000fa5a4da949ce29dd0fc20fe56c40d63ffded8e2dd88844f725efda0814ed526401000000000000001cc40fa83cd0a4431aa63315b55c669370a4037756089f3402a9021e2d8066640100000000000000742c0a1ea78a09c7454b48897bfde87bf4959b89c898623c8eeace7af714147d01000000000000003ce775a4a6215dbfbdc2b0a8a8b71936abd61642b5fd1a0c1d06ba548ad3025e0100000000000000bcb998778b7c2c182f396b311f92ae1289daeed9e62a3d8a8298b8dde7e1a52401000000000000004a1069d2203a75cd1078c39de35c16a6c4c12acbad34f1cba8efc065f80398610100000000000000cebdabff22e607a75aa8db1bf875511a563200cce3f089972aca719649b6e176010000000000000062c6c1f6f2478ee092c958842ac4351973bfeb49f55e33b8415ac0296a967b5f01000000000000008a6dbf87f769167b4eb982f63b946f96a1f223b6a6f2789183fec09581b8e906010000000000000056927fdc8bff2063e108fe1b05bbde2f6219bda7d8663fafcf3d2976c721535901000000000000009a64daca74d14dab93385e52ca70940732a8d45ae4b853ce156c3eeca06f0c5f0100000000000000eed7e8e8a64dfa89c548a31c1b9fec7af5aef4dbbdb26997b2ddca72d4f8790c0100000000000000fa49d3457520dd98ca1489b78354d7d30a9bdf2181140072ebda1c3dc3371e450100000000000000fe5ba24461a8be22c5e553d2715748ece9c50a621d1794e36ad6c40dcd5d9c230100000000000000b2ddb9eab0545b9ac7a46e37d6fc4605c34227d848416bd3637da7156efe612601000000000000001a15acd9aec8d1dd06c7b6a46be298c3fc2ecd51be6724a63da4da286e306f72010000000000000078cf1debe3fc0da2ed2473d1e1835a478cc3e7008e0cf42043f287bc36804b710100000000000000f853a1534a3af56217661420536dd7bea0db6f6db843d8fead77c308ed7dcc7c010000000000000032e2c97e308c84afea4b37d7dd8f62e67763126c357c9e6e49b27f54c3702b73010000000000000050d2e3ed042861cfddfecfb31d47caa1927064cb0372213a3015b2acdf1dd1450100000000000000843778dfeddea10578fab2773f2827c62fe0efe374d9a01eb370bd8f1427e7630100000000000000140fbeeabfb02dede7214a17c2cf78279d076c80d962431f35d1105c87b8d95501000000000000007cb1f225b90c00f426c33ac4338eeb2dae6467b8a9da5c1556e6588c12ca977b0100000000000000b261a66b9bae17b65e7f6a88d65efb4519925d6c418c9e2ba17bfdbf684b776301000000000000009c5d3bb1387f53f0306bf7f24e81dafa5bf972048de867e2e517938c4ebdf7120100000000000000560c91919fc22867159ed77bee1b3e70d2e222a5fe6e830fceb13b58b0daa5290100000000000000e03e94cd4419d9cb8709ad2859e598912c78c01b15eed53ec0c336d8d6c491420100000000000000ce60d2c987bbeeaceff8463484b717ce80cbcf3d8f8b2102e95effc88000d95d01000000000000003227028def74f8ea7bede3e112e4ce09d8fb823790ed599f2259019945f2690a0100000000000000c686fbbc968476537924f90aaa4993eef8314685d150228c462f8ae4e5e1e57f01000000000000004ca838afa9f12e88436eacb5024f3f94c95a66c32e114f65f3136176e426c75501000000000000000c60356c02d5d99293952c478fd07b2cff982dbad863ebdadf25c9e69206f14901000000000000003a8b589c8222ede45b3d95c8d9176543ffa9a29cbfa0ba2af60fc412e732d75e0100000000000000a43b19f13ec057124df240aad303e969f7d02fafc02c263d7ec814b6729d1b2001000000000000000884c85734b971a88cd94d86d3c62fdf163256a0387e15e2d36d8f25523a77480100000000000000f2cd13ba1efd67dfd5f8c9150b1a74d1ed1bad1a72c36fed96163b062e463d0101000000000000002001d47fbff7291a50650047b27cc47f1d22a0bdfbbfb0b8b7a6e8bbf350bf620100000000000000ecf0297bddebd3d766ea7def2bac79ad6eb650fabdcd029b99cb1649ff7dc8150100000000000000121f9d8ba85d89e3c6f9a0fedcdfc9b05cc40a6d3324eff6e8a58aec5f52590501000000000000008a16fb5a6718a714296cb8fa2ca708f677f78c7f883ba3c5ad1bbb9e23f37705010000000000000038c9a0897d9caff03a308d2120bbe892974ae8cb05f1cfe8b97259f0ac2e852901000000000000003491cc113ef8fe1165bb10e65cbb461955f92f8f0d82f2dcfe6664430dab853601000000000000004e466f6a4930d856a1f53f21c1a44451ead20c8c71319f6a685f0e254d24c32101000000000000007617b69110c43683b5000788259be855890c474be8fed65d7b1dae1d534ef85c01000000000000005e0fa84f762f7d6e4c4b0c18a86e1b7da6cb4fe7dfcf6b5c0056a7ccd8eb201401000000000000002037d70f4c244c81422409ad01d28d72a30d26e595fbcc791daeb57f78a8567001000000000000003cfa50228b841c7d2fab03db7e4bf282cf14e127ab9b31c23fca1a79be54e823010000000000000088fa8bb07ebce99964718c65d0d6f1b091ef2f4d4cdf7b94a22c42c007ecd706010000000000000052ac28ba2601723d23a086b5d775f19319f110ba5e9292f2af461e71903b5b50010000000000000002a4b2935b657f9ec563642ab0f34e223ef594cc70c856b9bd70fbe0837215600100000000000000c280e82e46ecabc4d68169e292c59cef96432f25fe849b8a147db5ca0ce7e17b010000000000000092e5bb9d0906f768dbdde0696b78e493cc78dc1f68789575b24f0b962799b51e01000000000000006ca32996225021dadb0b3f22460db6ce243faa3a0df7b33ef28e5fbcb9cf6f2f01000000000000004a512ac212da2c96d7bc8590865ce627e6b60246700595bb100b240e80a3f0760100000000000000f0c0cc64f8973ebc2322273e684b4f73f412503f124c130be0be1589718cdd780100000000000000322dcdf3a5f50091af8b876983da0e0e98e358339e6033cdb865cd64995f86130100000000000000b63f9ab3a147d76614bfb688751f79fb9a120d40af7ba3bb123c1957b91a411d010000000000000010e37a12fc6ed768d1a2d33c8abc6db675381dfe69c832abb77d9ba2341b3c4a01000000000000003213885ba6fd707b0716aeaad959cd824ab2f854e55963d9e69af006d194d51f0100000000000000fa1b0afc9ce9e9742c4825890f6d93bb87bd199e55e86ce66ba7c34ce43e273e01000000000000008013bf5a25c703e64dc4ae7e1248c0f2c7abad9e43672d82611d10974019985601000000000000007075de5f3cae26e005560440e9cc633c9fe8d7143b1fb8dc67e0d1ed7871e77d0100000000000000188d1a45dca0c370ba6b7952ba682570fd4f61501c4dea9826a981374a3f815f01000000000000004c1dbdaaf0fb061228d2245561476088bc608788cb3e9c5266f5a8e54bdd1e670100000000000000d23c53a531e356646133db73065cd83999693a5bdfc05931238434f5b031522f01000000000000006a40a8b74a142958efb2d75cd363635eccbfb70cddb24f0626d0ec927d98233801000000000000005e127fe875a9c6396693b778833a710b0426a4fc0af4af490e7ff0a6f3e8b61f0100000000000000aa74176b5870c97b754a157ec0d8032148c2ae717a905e0e5e626048b6f5334301000000000000003e07b075219fc7ace8dc3bf3a06f5dc12aa9c7e45fe30244d2284bcfb1e6ee190100000000000000a4a0bc81aaad1ebce3fdf896a8d6d081ab93efc2de9d5c56f2632edfeaa7ad0f0100000000000000465242c8915eea46e25549f2ab97cfe78784f25083e51773e07d5a0cafc2de32010000000000000022376791bf19fefac611324d27bc6acb4b7f7eec713c186adbeda5a1e1b88f340100000000000000bc8f93a45201992fa9d04355095d03adeb5ff1aea206425eae4f902ffd47fe200100000000000000288c08430a7e427400dd5b61926b74a82abcbbc91ac739190cc791a581f6836a0100000000000000eec1df2a382f2f9d0e7dbd91ebffe7be19dc9e01159cf3b82229a3ad2a33685b0100000000000000fecb15325d9baf603112dd397d2e83d3694414f529d75c4b639c7e775b979b14010000000000000028052d0b965ed862b7861aa7f3f91fe52ff8b0f795ff476c7e0a7aa42e79933001000000000000001c860d36fc84a54978d99ad400a719dbbef493f8631856e6def3e9ec998cde3e01000000000000002ef781a1d268b8afb0a8331ece83f3fff6877baa2d06ed9a23d484d5d70a5003010000000000000092cca18f264bdcfc19e5c01515ea9d61a0bf0b4e46b2bcae372a428b9dc35e390100000000000000e0b770b1bcf7deb030ee75d5bad6ec1ebfe06ded0fc406a8520a9650fe832330010000000000000066a5a598bd5d484fe66e630a3e57f3b245fe0413f81401d7a5d59aeed1a3a46301000000000000003622bfbaf9350b5906bdf9ce362e06726224ed141c5d29e8e175e0beedbd3d3d01000000000000000469db5710f30dc9ed7411417170efd62ce8bbe36ccab6df758a94aa7b7f720b010000000000000008e80cc5ada5e557a1cea3658402bc83f9892b5c4e112b6e157e6e7d3663c47b01000000000000007836067da2bc290dc3c428c548a4dbebfdeddbc10a2db206abb6ac11741dc63e01000000000000006ed90090a744a0d55adf8f8af5af4d5198bb67220ce33fe71121d7c51f27a4130100000000000000bc20aa968087f7c0d4bb35dd9c502db39fd7f4596a412880fdcd5ddba22fcf460100000000000000ea82745d9978e47fc6bb25fc01383aad42aeee65662b6af304474f0e4101b06f010000000000000072f2ff3d21f4126e217f10f9d9bd18069c12eaab6922d073dd5241ac718e91200100000000000000f25d3265659fca9d24ca877823644f1223714b0167d0a676cf3c9c447173d12f01000000000000009ab493c4c8007f49a3e7d1e9f1aef39b39cd66a496e90486e62664725c6ba06f010000000000000094cc8c46f9670417f5ad9492d17189c4e03e96122782e92824f05e176d6843790100000000000000369a7419ed7884aecd3cda7ec3576942cacde7a9b8f2fe9a1115be827e2ba83b010000000000000096ef8b525c38b9a74a3014bd99979230dab2f20221e8c7d1db50c7a61a02e97e01000000000000001827754b7465edb9bf4ce981bdd3a33057f9450fc895e39654dbd51c3ab9835a01000000000000008c45a06f479923e10cc400ae1600234f85906e26195bde9023350efaf0bc622c01000000000000006053f4e41a4db1dd6ddcd2304b62de45cda832c4e63a831ce9e634fab830d40d0100000000000000f2065428f52da2f7a881f9b94bfd38719bb6e5ff88a6800bbb3aebb1a9ad21020100000000000000104b3d784f0ae26bf3268fb7342a99fcbb1ea61068e03337df050ef2e0895374010000000000000092006149452119964a75232851f01361608dc0a52031f240e93e70e98a3ff21901000000000000009ad36892ec05281de9c63c7cefb3f31e448957a9572e650d9f3af1f21b2f515e0100000000000000bae8e68bc8f1b66fe3229ee72d77137b394c6b7dfbf55e424f9d2c82d5c99600010000000000000098f7988d5a74a0e52f58dd3d232ac3e93ff757480db9d4c12761b04fef032c460100000000000000248cddedee20dbb65f20a1715c2490c09241f6800b72d0c4029a1c234f2ce74b01000000000000008ca0a873b2685dde8c4792832cabe50ea5a1f8a9a661a336689859319b66ba6201000000000000001cf3abc7c9d8027488ea2f5f2463fd091b194fbeeebf560875e8648fbc67dc24010000000000000060b521110672f6f871978fd3ac4a835b5e30c3fa727c04c70dbc543fcad38b0e01000000000000001c103b038f0515bb77061128200e1f117a531cb4474cf5f9430535345f54196701000000000000002ab0b5cc358184be4fa29e7a3dc24806a72e55baad40ec9a117324a884242c2801000000000000005afe620da258a48f00c3afbb8a98161e977f076c7e7f8392975a4f0db4b57d6101000000000000001ae9aab4a890c558ac8ab90ccbbf193b3841083670ebed278b2161fa2ec7b3040100000000000000c2d156c96e21691a06cecd4a396978f94cfb3a1760d41180efe382b7ce8e993f01000000000000004616ac86f0d45899eed3f1246dc5744858a694a92b0abd9f10e52dfc9c2867460100000000000000a4b31af719e5d9c3b69326ef920736e8b620b329eade475ae23a33fbd445df7201000000000000009281394b5d35827c826e1d7444f346c247b9a004aa0292a9ca2b16e0fb55687701000000000000007e88cd54f47c1f4ddd9d3a198fc689d24a523fe186d526b14e476f14ced7db3c0100000000000000e6a08fa6af54d2308215f4a62d554dd5b82deaec8ba22a2e6ebade7202ab9e21010000000000000096e0b71982f3e7ba6ab06d28dfbf803caf4ac51b7633bee848f4f3fadc0dac480100000000000000068245d8a483bdbd4e9d88b49e17a651ec168f25e6851fc52c2e36a516031d5e0100000000000000386bcf52f4c464e6a18169f776d69e90880301f01fcc8cc0ba451f1d7e6c3b7c0100000000000000dc1d6d9b878558829a87267a578e1d044b2033888074dcc3a9fcd69cd5e60d3e0100000000000000b41546275611fa185c88c7016e909222b3a757b476316766a72729d074d8e92b01000000000000007e0da5500e4e91faec6b7c3763c52058a7a9350be3009f2fe00a8e3bf0c59e790100000000000000a8d082a4289fe5ccaada604e70c4b1473d6fae4374663672e61474852c1ebf2a0100000000000000309ab613bea03c4431f7602c937f5a4d17e2102db6fc7f77e32f7a245041b90c0100000000000000e0ee8ff76b364ad2ccc3e82e69cd700c0895607a449c5af3745bb3018a18432201000000000000005d9f86b7514745bf41299f7fb39969966e4b7556bc3942a51c95052f5233493901000000000000000400000000000000029ea154e5d5448f812bcac06720992209518325b0527502738bbbcedc30413c24e4563001019d20000000000000739efe10000000006009000000000000a50432904ec260963195582a1d339f9fbd2d5d76f551160105c922423cad0d94482f010000000000000076441c448aefcf40a72128edc9b44a4f7ef9c267c503e98f5f9c72d5e9e92f000100000000000000526e055ade4ac425e9b5f93ce4394601335d3599a5b742603126d78ce99a4a540100000000000000d0e8ddfdeacd8e163b01ca4da1a4e856312b0de412b492247070f2721f7d803801000000000000008008c1b7061a2402634fc15d3849e2913863beb9f55024bc8cc7fa7d6e397817010000000000000024a51a9bdb67213626d1b52bd8dbc0e9b94ea88ea417aa17b56212d1cea3e1780100000000000000488d520146f681678e9d229f5e29354edf65e521246b28a4175c0502e060b9200100000000000000c681c1acaa82eddba6e394ddc9a2fd1af34418448d544c34966a31c837667f280100000000000000ba395fcb33327501109ed40712c7a372d25bf3339edfabe2a1964fb7b5d4d82401000000000000009cb389c209afbebda2b12113e0266b3d30f46e2a91aaf4451c193d640288357101000000000000004c9886e2e62ee92a6778d6a7928052732044b64fa61969cd8e37f3f7e3406f720100000000000000c056f1879c1fd443e38244c26ef138218b3e43e70b1cb84bd7242e354cc9ee0e010000000000000026db7c5786fddc15f7e96905024905d877537451ed444cb97d3786361a59f64b0100000000000000c67b1b3084dc3eb2cc7a3cc4f742defc21b733e787737cbaf3b146a052633e0f01000000000000005237e4509f24bc9e8bf9bfd78b594219d86853ae16601f692f10c9b16b88f83b010000000000000098192016f83ef2fe74dba1ecc6526efc61b79f3177c00dc7c053160391858f700100000000000000a6f10752adf745ad55866031836194ad027ed8d6710d9853ef62982bcf45fd0e010000000000000078c35105ea4cd9d6ea0ba91b2c19e78f60931bef5918c1bd2e14259229e7c330010000000000000006d2846642c835b0fb1ff1ef908449376aa8e7c0f3352e55da9a1e97e9528b230100000000000000f8a681118ea0bb9dfde2813ce5144eeb5cee881c27883de1c0c759255ec32654010000000000000000b84e6e296de1009aeca95ee09bc5173aec6e91b1145b247d69e47758878972010000000000000090d25f2368ee57fb5c100140b7507d5831fb035e7632c53b532b65e6d14ba8480100000000000000e67c524e443cda4cd27dfcce70488a5d23a93c8c46a5e83ef5a69eff3a02fa5a0100000000000000a42289d68c963358f3c450a850242bb53121e73e17f0e2ea2b93327446bea33c01000000000000006c50859d9dde209012eb3868c1a3a6e80ae8fa528ace9df68e92dbbae60368200100000000000000a8e470f2339e3ed0da456780dd9207e9c6a02459238ec3057a6ade01fd6cd60a01000000000000005c7f05d77f853f3eb8d4989fce36d0808b6d2b881e26f13c01e939b5d489a57d01000000000000002addf696d5a42b0a3dada689731e00c991db936909df869ac6600662abc35310010000000000000072ed7192625403acef94aa9189f9f179deb89e60478816ca96c79b742f757e750100000000000000b4ffe3c5959ff37c11c6f19d91926cb97aa4bf0f604919e1753bb55664d061680100000000000000bc4c9b5425f9a2aa09e3239332c702dedbfffa2b9f4cc1b978b307fc1fa1337c0100000000000000e07d5b19d98a6f8ef5c964b507fcd88f500a2a0a9afd5cffe9d4e3f74d83b27f010000000000000024532b17fc5fb786660c52aeb03150799165dd05e88ce359189189a4b771f51e01000000000000008610e1f00a1eba67d13225867c1f2972e60604e49bea7e5c1b10b29d4841b84a0100000000000000be18787b5177e58664cd893fdaa20a3ca1bc9f1acbbb15036b046ae49c17c15b0100000000000000acef6dc8da16677955c38451be5a1b369fdc3c20bc249a1aec917276dfc2da580100000000000000c49cfd152ce3ac1fa142b3b6e720cb173eb7f43c82f021418253a070036f870c01000000000000006ec27dfa7ac9d35eb002c55d3e4d56b4df928dd5c44323ac228305741c9e09360100000000000000b89cbc83a386d6f5d4fed93289ee50fdf69d77369ca0c9a8b962554e3fc0d37e01000000000000009237113cf97fee5fafbeb82de593f6125e9c498bd59f0369625f46b326c7d9170100000000000000722d7d57085c250af633f2d461874d59aebc8021eb1112ec8805db5ddea53e5a0100000000000000a20797f3a8669a909adb22a3aee2844dba82d231cc33f5d9be0e2c533cb82a6701000000000000006a1274b6748bf822ba80c9a9416abd3cf591b7aee6adabb8359b7dbed8ebb3770100000000000000dc1274e0689c7a3eac31b41ce352719529e65c01f26999f74ce17c9905fce87401000000000000009c9bc1074cf465c0dd39f74bfdf16a67f81339ba2ad117a0c7030b4f0678771701000000000000005c0494412a296a92296160ac510697d97288753829a5e9d02eafb5f101e60f510100000000000000d8b38c77823eb1912bf8b743cca6c655ea1844ee468fbd78b394bf222bf8bc2001000000000000007251d6c376064f07f27d2532b05c091bd0978067b078c9f8d9984fd4216bdd4b0100000000000000487c6aad1cc26893dc7e498916a4c23d303f098c04b0a8b0c8242fbb7e73a16e010000000000000088f9a16886165d00612032cb1b36669ad62b7325536f499191e711134c71b6070100000000000000bc4b95226de4e10f91e0254cfe4541232252deaa347f567df124aba81bac4d3f010000000000000032636c64cae326ea37dfa4ddad688feb9829ada7a7d580a91ce03a50a673d01c01000000000000001eb833e31087d6baffee4e7f1d9a8e3b7013ea392c81f74313a354ba82e92f6b01000000000000009c8c7c8c91df0ed53864f69017d530b5ebda3ab4bde3c67027e70893213d533a010000000000000018ec239eec5457ba11a41518e7c5f98266d1bdbd67602641d04706f95dba5c560100000000000000c65c0a74887e9fe5cc56696fac7e7f5f1cd4a68f9661c8384b300bcdfbe67a1801000000000000003690e6ef639f685849ed93a6386d1fccf026c3fb64520940aa46af97f929e112010000000000000028a027ca1c0bdeebfc8fce85ac4bac48cc072523d9c4a86b4f2594f9142e7e3b010000000000000042e4c41a899dfb238649e5b17dc232c2699353635d60e6a3bdcd71f9b82cda300100000000000000ce4bfd8c5611b1637066ef9e579c85efadfc9513b882184e00b75871ef7f5a2d01000000000000005c0419f37036f2bf999f3958b49f63ab19d6dc19847a393dfd26cf303fc8d911010000000000000028558e46037c51ece4d39a8a4d34688662e629413c221d6226afe454240e70210100000000000000ee82f2670e36b9ad136ae1ab1607c35f3b49a8c93b86802c06df3ca62a2e3561010000000000000024a0c6db2090170748a7bae71b6f77b5dcc14c6acc5c58e8de78d317ccafe14401000000000000004a2073ae31b3df10d285eae6a5befe069183c4c6a6ffa1b2bf432011d0d475200100000000000000e41b3ecad757b0a5ecbc6b29691681df25b3d2b5f1ea325b648e607a5d76cf0801000000000000005461977495f9c407a8d951e860a1cb2087592103229bdbd879629cc538a4182b0100000000000000b05ad6cde0dfc019d740c3f50b8aac16550ff4c197da19cf23b9293f0c5c39070100000000000000bc56c07cea21bcbbe058aedd2ced9fb4757caead55f96bda9bed1c9669c32b64010000000000000078e1a4fecbaac940c04e0b591a01ea66a574b5098852ded2810e3a534971111f01000000000000006ccf2ce8e149999a7bb996faa65194e60aeb7bcd1937c787f886fe979fb49e6601000000000000000e5650026c7bee4fa43a2c7fcdc3452daa10b0530863ec686b1d5ee4d707600501000000000000001e866bed92016cd2dcabe2d87fcaf8c1d7248255cafb9e10638fc3a2b476221b0100000000000000946071eab9c0fa1de9be2ad3c18041f1326faab41d84d9daf9f89c0daf9c0f00010000000000000082b820c5bee8ee77e35203dab387f3434b8502e5f1c35dfb2ad15b5c89d47b3c01000000000000001cf3446b4b5116a1784d92cdc5101e55a5fb91ed3d93efccd06b304a94362d0a0100000000000000c6d5dc6e1ec83491397390449d8cddaa88631e8855efe50697788a93de00fb550100000000000000220d3f26072ad42aa5ca04b7253284d185f8bf95650faa170cbda8d7a47ea84a01000000000000003a4b0919068523aa04ab29f1b49bdc03a176a4b93f9b5a7e6e0cdcc8318691030100000000000000b288a9832e07bef83c5a8ca72c5a5583b321672ba7c6cdd44a971f855d32d95c01000000000000007480edf84ab569e559dccc99b87ecb9ae9db670b45a259b7f6e618b063e43113010000000000000020bedd48a5965e2fc0e221bd164deecdee849eb69cb8dc63a37df80b50a3093b010000000000000026c4a27200f70748b52f7277150d2db7e192b258d5001412e42c62c6e3ee1e5101000000000000004628f93047462b43ec0886f2c7d7318ddad1764fd32af4f32ef0b2dcfa4b297a010000000000000040a2527ffa7d30d788eca127d435c8b5aa48972cda538b9a1627a57e85c8fa1901000000000000003635c55546f19bfe62d84a220c4396b1c9d71a1acdb2da917a82f0c1415a2b020100000000000000844b691aa95ff9a15b50f5e5f4f0e582db6621326cf18d7533f55bc27549497a01000000000000002254fb9324a6a9af450ce3a4f5ab25f55deb22161e520b2308b8aaff42e3aa7401000000000000007c4b93d862704aad434ab3dc2cbef824df738c5dbe1ba7b34daa38b2aabf7c36010000000000000028e972febaf463f22d1108053e7c26ccde1e6018d7c302985bc227557e0a663b01000000000000007c4f928b915062d9cb15e854a9476cddbf7126c9de2fd70f67beaf2ebf6dbc5c0100000000000000fced8f1dff4f6c6852b0d643e26ee532086e72be7aecee28d94d1d59b5f9986701000000000000004a905d0574cebf6e8d00d382b104fc8ee1c008f1b9ffa6fa5c3b67ff29719c0d01000000000000008c64cd873a53fec10c4624239ce35d31d4422e32a109605a162fcbf632427733010000000000000026d7422872cbf4d4918046f240a13a37219a272f4326b3f3bd1249829bbcd12b0100000000000000be6106f9217a1847af66de9510fdfb40514409556506ddc1c1a897818434125b0100000000000000da98e4363908fa4d7980fe5574ceeac74fae49bf77b3a191654c7731214a565e0100000000000000ae2e94f092fbcfe263519f950b5ade09c474258a4e0d5e62570d02b3f71d85480100000000000000bca6409d6d7e4f94ce797594db4363bb8bebd5387770aee0bb7663b36354fe2a0100000000000000b2518044cc31062ee50fa81cb6983f314291a0300865fa5cfe149829c5050d24010000000000000086c1922e4ed392d72e0fbc0ee28e7ec0a8ba2b33470330a606cec9a159a79626010000000000000036465f4be77147914969ea78f8e39610310679011dfbb6137dab12e18a687a5201000000000000004e8cc21504fda961cf1cfe78e651d033b10f8ab1a4a0c757bd4848a7f2827f0601000000000000004ad8fedb395dc0ed63e0edbdbd2d20555b61a46aa7cd751e4308335c277cbd6a01000000000000004c5e6997b6f186855b1f4c9f8ab2d6cea3da2e86445605ab89e5b5821e05bd3d0100000000000000a6cd7eca570e90e2efeeda8f1c09480884a073c66fc7c41b2464e11822b12f0c0100000000000000944ad19383a9ae136f4f11c15687923b9b21319efab021336a3e8f2bd5b5ca20010000000000000068508b2ca3e01d7c8d79d99f1bb06a93058d14f1061d5fed4df13d4bc30aa557010000000000000074f02ed037d28c883df643034a596e4d2a97a23782ee8483c9ae3429ede7e7090100000000000000b045bf0235bbe708e4d6918758650c9c7f9ab4d638e4a841807ed7c82ff7f63a01000000000000005c252543704920d6bea67453cdd61b464b001badf73a3ea3b9e9fb35b224947201000000000000006e7a78e9fdfe275f3e000382ba30452729970578258839db6c0fc568e20b3515010000000000000004734733edcd9cf662389208fb8ccb5f274a7db8187ccc53dc84250f8599d54d01000000000000004e1b48e67c1e62e46add39fa523b956946228ea0f08bd9d20ced798cfc9a0f5b010000000000000010fee28789d45569ac0c95b7287fc7c5f087d93516cbd06e3c074a392d86da300100000000000000faa6ae896c2d1040e495acbdcd8d90a02ccb17ba6e507efa2f7deacb3b28466e0100000000000000840290d318350bff32db3dcf6138b822cb2adf1dedf5bad8729471988955915c0100000000000000907ff7ac1e6c451d236c05c8d3f85640d9f9472d6a30115fc26135dae020e6380100000000000000c264fe63e84cd004530d2a3eabdde5098fe5c6b619af7fc6c9cfeba01e75ee5701000000000000001ec005e9ca3c15b2994641dd22efcbb20032f10894f76f57296d219dc149817b0100000000000000a07f151db53097c2da9dac4b2e0f194931a677a3ba99df0f3976e34409fd64760100000000000000d8faee17dcc461acb22ca1720b86385414ea8810ba31509fbd8da8733029eb190100000000000000b071e9d6b444a555e034ecdc4d04f2528cc36b347b231b33388564a40fd32b2c0100000000000000f820a8ed2c97f639fea2892d0a89ae98ffc4c0054f948f9a0108e4d99f89994c0100000000000000fcd5f4c4fe11f20ad99dc8345b7dc5600caba5d5b7d3f499c3253c095152d45401000000000000005eac8ac37c95fc11921839550a30ef071bbc80fb10ea1482cc67818e184d544a0100000000000000ea2b17bd1b69a7b442dd000db0f12f0bd4bf7a87a540427986bd32f3d3bd55580100000000000000142445d894c1236a38c6b1bcd9f5a7245897026424ce9544002008a7702c3b1d0100000000000000d6acabff06fe9a6ccf02f780f33902672fae0f038d8e19ee234ce28a0b6a01410100000000000000f894d159aa4b63402119985e2243e77fc35787fb086867659412c8c6918b2a670100000000000000780e4353aca40b0f2b2403c862cb33032d49a820244bdc2853ce158d48c4f61001000000000000000e2daa2ef7884bdc7ca5f843f4f33f070c790e9a19d314bceefd04622920216301000000000000003e8394db87d36ddce56bfe0b86922dcc9a86d1ba061600e22d9694027b18c8400100000000000000c60a9f5f89ea3a56499bcd39bac7e038c25f5b7720d873fdc12b68d2531eb650010000000000000040b77fd8fcabe868dc7f2a08bf14c67e4d433886c3cd3738d1b0b9c649bafc230100000000000000cef0feb2602582b96fec882181d34bd5504645c544c983b1a962188239eed90a0100000000000000b633c47d126eceb0e36d788370ebaa179b0c7a3a21cf5f1421bfac40c895ed3c010000000000000092ee092cd2215c7c1628086c08be10a3cb969f6b276f600422f3526f303bd878010000000000000024190e384934261c444897054262813c65a73aaf371806db97762e995e5b350e0100000000000000020d34131c7a0ab6d104839ed8b9e0cdf075b80409a36fbe94d0cf83f7ea1f1e010000000000000022333a4409728530184f55b95171d2ddcec037603382fc7d6443b1f7b96c813601000000000000009acfd215519f40156749868afc8d56e015759f71cf183fe68382e8c02c75b2510100000000000000f44b3ec5c7b2188f208d60d159d1f5b0914a51a0632eacea6b88ec7b26d6673d01000000000000005ce79c3ad8a0e1806e863f0858c28a81408d19870a62ac0316b3e6345cbb5f76010000000000000006451fa7b2d831264e40a3e5b8452ede10164b7162a0e93bb9789a102c3010420100000000000000b672ee2f0f9183585ac4875368a0defda6d3c81927fbfc34bbacc7481058cb4b010000000000000022a66dd6397c2631df509db3482baac28b546729e6ce965472a9ba2e648ccc74010000000000000082bb250beb58df1c5346dc5dc26dbc38647a59fcd5c220c41466606cd855a2520100000000000000767cb742c94b22fff80da70a4ea77069aecde7ded53fbf5d957b01196924cd2d0100000000000000a065f45a353f24ba187248aacd9c64d5c3a92ddf92b4a5c33994f56a07cea840010000000000000078c91c4ee02089ea86612f66d6022a0cbd54afe470a162a72036611623924f6d01000000000000005432de09683010f3c1a6a977dd0dfdd8c5ce9fdb85225b9b7dc8e451e340cb240100000000000000464cb5dfedc6938caef6caaf5a58f4925a295f24a4f37337033dafa0cc733e66010000000000000016f34c9e6687012c42f9c02de75b9499849fe771f2ad2e666f965dc6627735540100000000000000f60b5e74957220ed7664befb71e9621436e40f2b6c1bdb1c90a6de9c3540a84001000000000000002a98fbaf7ec22832522e3f96821711ef684283911a524960efb14953255baa2b0100000000000000fe0af833307f4cff497d006ec63385b1c191efd6a4547fb05a355cd23686dd0401000000000000004ed5f55ec45727a57e2d8d6914f6d2acffb17b9515d347ba045067502a0b140201000000000000004cb98af1a70e917453f5dea682917e7b3077ea9d41dda7764433258a9d5db54b01000000000000002a0fda136ae348db338b87bed349145a94ce091227774b0542e533a83d1ba455010000000000000036c5a061b47768957b2b939b2e37e4cdf8825a4abf963c4f912f3ba4cd567f1e010000000000000076fa252aeca5b108fe76ce12e395ed8105d5c98e4abae38bfc7cb4fbd4d43d5501000000000000006a5607bc375d7ac0908e7643ea2e89dbe42f4f805c2fb6e2a22d0385c1232b310100000000000000f4ccdf83d734edcc568462572abaf32d22ac7faf8000195e02273d1c9665430801000000000000007eb2b0b6adbe5a5bad38f46db207f94c896d419661f4ab8f21e302a543df9b11010000000000000048ce0aba6f1554e139568b4d2358d6cca9bc291d3600787cc3e732291002ca2201000000000000007a07e4b6b4daf45f4af2a98e7458034447ae0e67e9a22596848e58d4ba73b9530100000000000000fa30595578d5e253a0a3701616665cb205fc02eb560c023454c280bfc6cd8d090100000000000000c4c5fe47a568c2fe4876eafd5e0093dcc31b450eb87bfe58397dfae2a590d4650100000000000000c670e2b0f864f126be43807610aab3295cb4ed6a684d95de331d700f74e2985e0100000000000000fa5a4da949ce29dd0fc20fe56c40d63ffded8e2dd88844f725efda0814ed526401000000000000001cc40fa83cd0a4431aa63315b55c669370a4037756089f3402a9021e2d8066640100000000000000742c0a1ea78a09c7454b48897bfde87bf4959b89c898623c8eeace7af714147d01000000000000003ce775a4a6215dbfbdc2b0a8a8b71936abd61642b5fd1a0c1d06ba548ad3025e0100000000000000bcb998778b7c2c182f396b311f92ae1289daeed9e62a3d8a8298b8dde7e1a52401000000000000004a1069d2203a75cd1078c39de35c16a6c4c12acbad34f1cba8efc065f80398610100000000000000cebdabff22e607a75aa8db1bf875511a563200cce3f089972aca719649b6e176010000000000000062c6c1f6f2478ee092c958842ac4351973bfeb49f55e33b8415ac0296a967b5f01000000000000008a6dbf87f769167b4eb982f63b946f96a1f223b6a6f2789183fec09581b8e906010000000000000056927fdc8bff2063e108fe1b05bbde2f6219bda7d8663fafcf3d2976c721535901000000000000009a64daca74d14dab93385e52ca70940732a8d45ae4b853ce156c3eeca06f0c5f0100000000000000eed7e8e8a64dfa89c548a31c1b9fec7af5aef4dbbdb26997b2ddca72d4f8790c0100000000000000fa49d3457520dd98ca1489b78354d7d30a9bdf2181140072ebda1c3dc3371e450100000000000000fe5ba24461a8be22c5e553d2715748ece9c50a621d1794e36ad6c40dcd5d9c230100000000000000b2ddb9eab0545b9ac7a46e37d6fc4605c34227d848416bd3637da7156efe612601000000000000001a15acd9aec8d1dd06c7b6a46be298c3fc2ecd51be6724a63da4da286e306f72010000000000000078cf1debe3fc0da2ed2473d1e1835a478cc3e7008e0cf42043f287bc36804b710100000000000000f853a1534a3af56217661420536dd7bea0db6f6db843d8fead77c308ed7dcc7c010000000000000032e2c97e308c84afea4b37d7dd8f62e67763126c357c9e6e49b27f54c3702b73010000000000000050d2e3ed042861cfddfecfb31d47caa1927064cb0372213a3015b2acdf1dd1450100000000000000843778dfeddea10578fab2773f2827c62fe0efe374d9a01eb370bd8f1427e7630100000000000000140fbeeabfb02dede7214a17c2cf78279d076c80d962431f35d1105c87b8d95501000000000000007cb1f225b90c00f426c33ac4338eeb2dae6467b8a9da5c1556e6588c12ca977b0100000000000000b261a66b9bae17b65e7f6a88d65efb4519925d6c418c9e2ba17bfdbf684b776301000000000000009c5d3bb1387f53f0306bf7f24e81dafa5bf972048de867e2e517938c4ebdf7120100000000000000560c91919fc22867159ed77bee1b3e70d2e222a5fe6e830fceb13b58b0daa5290100000000000000e03e94cd4419d9cb8709ad2859e598912c78c01b15eed53ec0c336d8d6c491420100000000000000ce60d2c987bbeeaceff8463484b717ce80cbcf3d8f8b2102e95effc88000d95d01000000000000003227028def74f8ea7bede3e112e4ce09d8fb823790ed599f2259019945f2690a0100000000000000c686fbbc968476537924f90aaa4993eef8314685d150228c462f8ae4e5e1e57f01000000000000004ca838afa9f12e88436eacb5024f3f94c95a66c32e114f65f3136176e426c75501000000000000000c60356c02d5d99293952c478fd07b2cff982dbad863ebdadf25c9e69206f14901000000000000003a8b589c8222ede45b3d95c8d9176543ffa9a29cbfa0ba2af60fc412e732d75e0100000000000000a43b19f13ec057124df240aad303e969f7d02fafc02c263d7ec814b6729d1b2001000000000000000884c85734b971a88cd94d86d3c62fdf163256a0387e15e2d36d8f25523a77480100000000000000f2cd13ba1efd67dfd5f8c9150b1a74d1ed1bad1a72c36fed96163b062e463d0101000000000000002001d47fbff7291a50650047b27cc47f1d22a0bdfbbfb0b8b7a6e8bbf350bf620100000000000000ecf0297bddebd3d766ea7def2bac79ad6eb650fabdcd029b99cb1649ff7dc8150100000000000000121f9d8ba85d89e3c6f9a0fedcdfc9b05cc40a6d3324eff6e8a58aec5f52590501000000000000008a16fb5a6718a714296cb8fa2ca708f677f78c7f883ba3c5ad1bbb9e23f37705010000000000000038c9a0897d9caff03a308d2120bbe892974ae8cb05f1cfe8b97259f0ac2e852901000000000000003491cc113ef8fe1165bb10e65cbb461955f92f8f0d82f2dcfe6664430dab853601000000000000004e466f6a4930d856a1f53f21c1a44451ead20c8c71319f6a685f0e254d24c32101000000000000007617b69110c43683b5000788259be855890c474be8fed65d7b1dae1d534ef85c01000000000000005e0fa84f762f7d6e4c4b0c18a86e1b7da6cb4fe7dfcf6b5c0056a7ccd8eb201401000000000000002037d70f4c244c81422409ad01d28d72a30d26e595fbcc791daeb57f78a8567001000000000000003cfa50228b841c7d2fab03db7e4bf282cf14e127ab9b31c23fca1a79be54e823010000000000000088fa8bb07ebce99964718c65d0d6f1b091ef2f4d4cdf7b94a22c42c007ecd706010000000000000052ac28ba2601723d23a086b5d775f19319f110ba5e9292f2af461e71903b5b50010000000000000002a4b2935b657f9ec563642ab0f34e223ef594cc70c856b9bd70fbe0837215600100000000000000c280e82e46ecabc4d68169e292c59cef96432f25fe849b8a147db5ca0ce7e17b010000000000000092e5bb9d0906f768dbdde0696b78e493cc78dc1f68789575b24f0b962799b51e01000000000000006ca32996225021dadb0b3f22460db6ce243faa3a0df7b33ef28e5fbcb9cf6f2f01000000000000004a512ac212da2c96d7bc8590865ce627e6b60246700595bb100b240e80a3f0760100000000000000f0c0cc64f8973ebc2322273e684b4f73f412503f124c130be0be1589718cdd780100000000000000322dcdf3a5f50091af8b876983da0e0e98e358339e6033cdb865cd64995f86130100000000000000b63f9ab3a147d76614bfb688751f79fb9a120d40af7ba3bb123c1957b91a411d010000000000000010e37a12fc6ed768d1a2d33c8abc6db675381dfe69c832abb77d9ba2341b3c4a01000000000000003213885ba6fd707b0716aeaad959cd824ab2f854e55963d9e69af006d194d51f0100000000000000fa1b0afc9ce9e9742c4825890f6d93bb87bd199e55e86ce66ba7c34ce43e273e01000000000000008013bf5a25c703e64dc4ae7e1248c0f2c7abad9e43672d82611d10974019985601000000000000007075de5f3cae26e005560440e9cc633c9fe8d7143b1fb8dc67e0d1ed7871e77d0100000000000000188d1a45dca0c370ba6b7952ba682570fd4f61501c4dea9826a981374a3f815f01000000000000004c1dbdaaf0fb061228d2245561476088bc608788cb3e9c5266f5a8e54bdd1e670100000000000000d23c53a531e356646133db73065cd83999693a5bdfc05931238434f5b031522f01000000000000006a40a8b74a142958efb2d75cd363635eccbfb70cddb24f0626d0ec927d98233801000000000000005e127fe875a9c6396693b778833a710b0426a4fc0af4af490e7ff0a6f3e8b61f0100000000000000aa74176b5870c97b754a157ec0d8032148c2ae717a905e0e5e626048b6f5334301000000000000003e07b075219fc7ace8dc3bf3a06f5dc12aa9c7e45fe30244d2284bcfb1e6ee190100000000000000a4a0bc81aaad1ebce3fdf896a8d6d081ab93efc2de9d5c56f2632edfeaa7ad0f0100000000000000465242c8915eea46e25549f2ab97cfe78784f25083e51773e07d5a0cafc2de32010000000000000022376791bf19fefac611324d27bc6acb4b7f7eec713c186adbeda5a1e1b88f340100000000000000bc8f93a45201992fa9d04355095d03adeb5ff1aea206425eae4f902ffd47fe200100000000000000288c08430a7e427400dd5b61926b74a82abcbbc91ac739190cc791a581f6836a0100000000000000eec1df2a382f2f9d0e7dbd91ebffe7be19dc9e01159cf3b82229a3ad2a33685b0100000000000000fecb15325d9baf603112dd397d2e83d3694414f529d75c4b639c7e775b979b14010000000000000028052d0b965ed862b7861aa7f3f91fe52ff8b0f795ff476c7e0a7aa42e79933001000000000000001c860d36fc84a54978d99ad400a719dbbef493f8631856e6def3e9ec998cde3e01000000000000002ef781a1d268b8afb0a8331ece83f3fff6877baa2d06ed9a23d484d5d70a5003010000000000000092cca18f264bdcfc19e5c01515ea9d61a0bf0b4e46b2bcae372a428b9dc35e390100000000000000e0b770b1bcf7deb030ee75d5bad6ec1ebfe06ded0fc406a8520a9650fe832330010000000000000066a5a598bd5d484fe66e630a3e57f3b245fe0413f81401d7a5d59aeed1a3a46301000000000000003622bfbaf9350b5906bdf9ce362e06726224ed141c5d29e8e175e0beedbd3d3d01000000000000000469db5710f30dc9ed7411417170efd62ce8bbe36ccab6df758a94aa7b7f720b010000000000000008e80cc5ada5e557a1cea3658402bc83f9892b5c4e112b6e157e6e7d3663c47b01000000000000007836067da2bc290dc3c428c548a4dbebfdeddbc10a2db206abb6ac11741dc63e01000000000000006ed90090a744a0d55adf8f8af5af4d5198bb67220ce33fe71121d7c51f27a4130100000000000000bc20aa968087f7c0d4bb35dd9c502db39fd7f4596a412880fdcd5ddba22fcf460100000000000000ea82745d9978e47fc6bb25fc01383aad42aeee65662b6af304474f0e4101b06f010000000000000072f2ff3d21f4126e217f10f9d9bd18069c12eaab6922d073dd5241ac718e91200100000000000000f25d3265659fca9d24ca877823644f1223714b0167d0a676cf3c9c447173d12f01000000000000009ab493c4c8007f49a3e7d1e9f1aef39b39cd66a496e90486e62664725c6ba06f010000000000000094cc8c46f9670417f5ad9492d17189c4e03e96122782e92824f05e176d6843790100000000000000369a7419ed7884aecd3cda7ec3576942cacde7a9b8f2fe9a1115be827e2ba83b010000000000000096ef8b525c38b9a74a3014bd99979230dab2f20221e8c7d1db50c7a61a02e97e01000000000000001827754b7465edb9bf4ce981bdd3a33057f9450fc895e39654dbd51c3ab9835a01000000000000008c45a06f479923e10cc400ae1600234f85906e26195bde9023350efaf0bc622c01000000000000006053f4e41a4db1dd6ddcd2304b62de45cda832c4e63a831ce9e634fab830d40d0100000000000000f2065428f52da2f7a881f9b94bfd38719bb6e5ff88a6800bbb3aebb1a9ad21020100000000000000104b3d784f0ae26bf3268fb7342a99fcbb1ea61068e03337df050ef2e0895374010000000000000092006149452119964a75232851f01361608dc0a52031f240e93e70e98a3ff21901000000000000009ad36892ec05281de9c63c7cefb3f31e448957a9572e650d9f3af1f21b2f515e0100000000000000bae8e68bc8f1b66fe3229ee72d77137b394c6b7dfbf55e424f9d2c82d5c99600010000000000000098f7988d5a74a0e52f58dd3d232ac3e93ff757480db9d4c12761b04fef032c460100000000000000248cddedee20dbb65f20a1715c2490c09241f6800b72d0c4029a1c234f2ce74b01000000000000008ca0a873b2685dde8c4792832cabe50ea5a1f8a9a661a336689859319b66ba6201000000000000001cf3abc7c9d8027488ea2f5f2463fd091b194fbeeebf560875e8648fbc67dc24010000000000000060b521110672f6f871978fd3ac4a835b5e30c3fa727c04c70dbc543fcad38b0e01000000000000001c103b038f0515bb77061128200e1f117a531cb4474cf5f9430535345f54196701000000000000002ab0b5cc358184be4fa29e7a3dc24806a72e55baad40ec9a117324a884242c2801000000000000005afe620da258a48f00c3afbb8a98161e977f076c7e7f8392975a4f0db4b57d6101000000000000001ae9aab4a890c558ac8ab90ccbbf193b3841083670ebed278b2161fa2ec7b3040100000000000000c2d156c96e21691a06cecd4a396978f94cfb3a1760d41180efe382b7ce8e993f01000000000000004616ac86f0d45899eed3f1246dc5744858a694a92b0abd9f10e52dfc9c2867460100000000000000a4b31af719e5d9c3b69326ef920736e8b620b329eade475ae23a33fbd445df7201000000000000009281394b5d35827c826e1d7444f346c247b9a004aa0292a9ca2b16e0fb55687701000000000000007e88cd54f47c1f4ddd9d3a198fc689d24a523fe186d526b14e476f14ced7db3c0100000000000000e6a08fa6af54d2308215f4a62d554dd5b82deaec8ba22a2e6ebade7202ab9e21010000000000000096e0b71982f3e7ba6ab06d28dfbf803caf4ac51b7633bee848f4f3fadc0dac480100000000000000068245d8a483bdbd4e9d88b49e17a651ec168f25e6851fc52c2e36a516031d5e0100000000000000386bcf52f4c464e6a18169f776d69e90880301f01fcc8cc0ba451f1d7e6c3b7c0100000000000000dc1d6d9b878558829a87267a578e1d044b2033888074dcc3a9fcd69cd5e60d3e0100000000000000b41546275611fa185c88c7016e909222b3a757b476316766a72729d074d8e92b01000000000000007e0da5500e4e91faec6b7c3763c52058a7a9350be3009f2fe00a8e3bf0c59e790100000000000000a8d082a4289fe5ccaada604e70c4b1473d6fae4374663672e61474852c1ebf2a0100000000000000309ab613bea03c4431f7602c937f5a4d17e2102db6fc7f77e32f7a245041b90c0100000000000000e0ee8ff76b364ad2ccc3e82e69cd700c0895607a449c5af3745bb3018a18432201000000000000005d9f86b7514745bf41299f7fb39969966e4b7556bc3942a51c95052f523349390100000000000000040000000000000002dc81f2058c70567f7c85ded467631941c2efb85ba96e2c9328f10be4774092dc904d3001019c200000000000001395fe10000000006009000000000000a50432904ec260963195582a1d339f9fbd2d5d76f551160105c922423cad0d94482f010000000000000076441c448aefcf40a72128edc9b44a4f7ef9c267c503e98f5f9c72d5e9e92f000100000000000000526e055ade4ac425e9b5f93ce4394601335d3599a5b742603126d78ce99a4a540100000000000000d0e8ddfdeacd8e163b01ca4da1a4e856312b0de412b492247070f2721f7d803801000000000000008008c1b7061a2402634fc15d3849e2913863beb9f55024bc8cc7fa7d6e397817010000000000000024a51a9bdb67213626d1b52bd8dbc0e9b94ea88ea417aa17b56212d1cea3e1780100000000000000488d520146f681678e9d229f5e29354edf65e521246b28a4175c0502e060b9200100000000000000c681c1acaa82eddba6e394ddc9a2fd1af34418448d544c34966a31c837667f280100000000000000ba395fcb33327501109ed40712c7a372d25bf3339edfabe2a1964fb7b5d4d82401000000000000009cb389c209afbebda2b12113e0266b3d30f46e2a91aaf4451c193d640288357101000000000000004c9886e2e62ee92a6778d6a7928052732044b64fa61969cd8e37f3f7e3406f720100000000000000c056f1879c1fd443e38244c26ef138218b3e43e70b1cb84bd7242e354cc9ee0e010000000000000026db7c5786fddc15f7e96905024905d877537451ed444cb97d3786361a59f64b0100000000000000c67b1b3084dc3eb2cc7a3cc4f742defc21b733e787737cbaf3b146a052633e0f01000000000000005237e4509f24bc9e8bf9bfd78b594219d86853ae16601f692f10c9b16b88f83b010000000000000098192016f83ef2fe74dba1ecc6526efc61b79f3177c00dc7c053160391858f700100000000000000a6f10752adf745ad55866031836194ad027ed8d6710d9853ef62982bcf45fd0e010000000000000078c35105ea4cd9d6ea0ba91b2c19e78f60931bef5918c1bd2e14259229e7c330010000000000000006d2846642c835b0fb1ff1ef908449376aa8e7c0f3352e55da9a1e97e9528b230100000000000000f8a681118ea0bb9dfde2813ce5144eeb5cee881c27883de1c0c759255ec32654010000000000000000b84e6e296de1009aeca95ee09bc5173aec6e91b1145b247d69e47758878972010000000000000090d25f2368ee57fb5c100140b7507d5831fb035e7632c53b532b65e6d14ba8480100000000000000e67c524e443cda4cd27dfcce70488a5d23a93c8c46a5e83ef5a69eff3a02fa5a0100000000000000a42289d68c963358f3c450a850242bb53121e73e17f0e2ea2b93327446bea33c01000000000000006c50859d9dde209012eb3868c1a3a6e80ae8fa528ace9df68e92dbbae60368200100000000000000a8e470f2339e3ed0da456780dd9207e9c6a02459238ec3057a6ade01fd6cd60a01000000000000005c7f05d77f853f3eb8d4989fce36d0808b6d2b881e26f13c01e939b5d489a57d01000000000000002addf696d5a42b0a3dada689731e00c991db936909df869ac6600662abc35310010000000000000072ed7192625403acef94aa9189f9f179deb89e60478816ca96c79b742f757e750100000000000000b4ffe3c5959ff37c11c6f19d91926cb97aa4bf0f604919e1753bb55664d061680100000000000000bc4c9b5425f9a2aa09e3239332c702dedbfffa2b9f4cc1b978b307fc1fa1337c0100000000000000e07d5b19d98a6f8ef5c964b507fcd88f500a2a0a9afd5cffe9d4e3f74d83b27f010000000000000024532b17fc5fb786660c52aeb03150799165dd05e88ce359189189a4b771f51e01000000000000008610e1f00a1eba67d13225867c1f2972e60604e49bea7e5c1b10b29d4841b84a0100000000000000be18787b5177e58664cd893fdaa20a3ca1bc9f1acbbb15036b046ae49c17c15b0100000000000000acef6dc8da16677955c38451be5a1b369fdc3c20bc249a1aec917276dfc2da580100000000000000c49cfd152ce3ac1fa142b3b6e720cb173eb7f43c82f021418253a070036f870c01000000000000006ec27dfa7ac9d35eb002c55d3e4d56b4df928dd5c44323ac228305741c9e09360100000000000000b89cbc83a386d6f5d4fed93289ee50fdf69d77369ca0c9a8b962554e3fc0d37e01000000000000009237113cf97fee5fafbeb82de593f6125e9c498bd59f0369625f46b326c7d9170100000000000000722d7d57085c250af633f2d461874d59aebc8021eb1112ec8805db5ddea53e5a0100000000000000a20797f3a8669a909adb22a3aee2844dba82d231cc33f5d9be0e2c533cb82a6701000000000000006a1274b6748bf822ba80c9a9416abd3cf591b7aee6adabb8359b7dbed8ebb3770100000000000000dc1274e0689c7a3eac31b41ce352719529e65c01f26999f74ce17c9905fce87401000000000000009c9bc1074cf465c0dd39f74bfdf16a67f81339ba2ad117a0c7030b4f0678771701000000000000005c0494412a296a92296160ac510697d97288753829a5e9d02eafb5f101e60f510100000000000000d8b38c77823eb1912bf8b743cca6c655ea1844ee468fbd78b394bf222bf8bc2001000000000000007251d6c376064f07f27d2532b05c091bd0978067b078c9f8d9984fd4216bdd4b0100000000000000487c6aad1cc26893dc7e498916a4c23d303f098c04b0a8b0c8242fbb7e73a16e010000000000000088f9a16886165d00612032cb1b36669ad62b7325536f499191e711134c71b6070100000000000000bc4b95226de4e10f91e0254cfe4541232252deaa347f567df124aba81bac4d3f010000000000000032636c64cae326ea37dfa4ddad688feb9829ada7a7d580a91ce03a50a673d01c01000000000000001eb833e31087d6baffee4e7f1d9a8e3b7013ea392c81f74313a354ba82e92f6b01000000000000009c8c7c8c91df0ed53864f69017d530b5ebda3ab4bde3c67027e70893213d533a010000000000000018ec239eec5457ba11a41518e7c5f98266d1bdbd67602641d04706f95dba5c560100000000000000c65c0a74887e9fe5cc56696fac7e7f5f1cd4a68f9661c8384b300bcdfbe67a1801000000000000003690e6ef639f685849ed93a6386d1fccf026c3fb64520940aa46af97f929e112010000000000000028a027ca1c0bdeebfc8fce85ac4bac48cc072523d9c4a86b4f2594f9142e7e3b010000000000000042e4c41a899dfb238649e5b17dc232c2699353635d60e6a3bdcd71f9b82cda300100000000000000ce4bfd8c5611b1637066ef9e579c85efadfc9513b882184e00b75871ef7f5a2d01000000000000005c0419f37036f2bf999f3958b49f63ab19d6dc19847a393dfd26cf303fc8d911010000000000000028558e46037c51ece4d39a8a4d34688662e629413c221d6226afe454240e70210100000000000000ee82f2670e36b9ad136ae1ab1607c35f3b49a8c93b86802c06df3ca62a2e3561010000000000000024a0c6db2090170748a7bae71b6f77b5dcc14c6acc5c58e8de78d317ccafe14401000000000000004a2073ae31b3df10d285eae6a5befe069183c4c6a6ffa1b2bf432011d0d475200100000000000000e41b3ecad757b0a5ecbc6b29691681df25b3d2b5f1ea325b648e607a5d76cf0801000000000000005461977495f9c407a8d951e860a1cb2087592103229bdbd879629cc538a4182b0100000000000000b05ad6cde0dfc019d740c3f50b8aac16550ff4c197da19cf23b9293f0c5c39070100000000000000bc56c07cea21bcbbe058aedd2ced9fb4757caead55f96bda9bed1c9669c32b64010000000000000078e1a4fecbaac940c04e0b591a01ea66a574b5098852ded2810e3a534971111f01000000000000006ccf2ce8e149999a7bb996faa65194e60aeb7bcd1937c787f886fe979fb49e6601000000000000000e5650026c7bee4fa43a2c7fcdc3452daa10b0530863ec686b1d5ee4d707600501000000000000001e866bed92016cd2dcabe2d87fcaf8c1d7248255cafb9e10638fc3a2b476221b0100000000000000946071eab9c0fa1de9be2ad3c18041f1326faab41d84d9daf9f89c0daf9c0f00010000000000000082b820c5bee8ee77e35203dab387f3434b8502e5f1c35dfb2ad15b5c89d47b3c01000000000000001cf3446b4b5116a1784d92cdc5101e55a5fb91ed3d93efccd06b304a94362d0a0100000000000000c6d5dc6e1ec83491397390449d8cddaa88631e8855efe50697788a93de00fb550100000000000000220d3f26072ad42aa5ca04b7253284d185f8bf95650faa170cbda8d7a47ea84a01000000000000003a4b0919068523aa04ab29f1b49bdc03a176a4b93f9b5a7e6e0cdcc8318691030100000000000000b288a9832e07bef83c5a8ca72c5a5583b321672ba7c6cdd44a971f855d32d95c01000000000000007480edf84ab569e559dccc99b87ecb9ae9db670b45a259b7f6e618b063e43113010000000000000020bedd48a5965e2fc0e221bd164deecdee849eb69cb8dc63a37df80b50a3093b010000000000000026c4a27200f70748b52f7277150d2db7e192b258d5001412e42c62c6e3ee1e5101000000000000004628f93047462b43ec0886f2c7d7318ddad1764fd32af4f32ef0b2dcfa4b297a010000000000000040a2527ffa7d30d788eca127d435c8b5aa48972cda538b9a1627a57e85c8fa1901000000000000003635c55546f19bfe62d84a220c4396b1c9d71a1acdb2da917a82f0c1415a2b020100000000000000844b691aa95ff9a15b50f5e5f4f0e582db6621326cf18d7533f55bc27549497a01000000000000002254fb9324a6a9af450ce3a4f5ab25f55deb22161e520b2308b8aaff42e3aa7401000000000000007c4b93d862704aad434ab3dc2cbef824df738c5dbe1ba7b34daa38b2aabf7c36010000000000000028e972febaf463f22d1108053e7c26ccde1e6018d7c302985bc227557e0a663b01000000000000007c4f928b915062d9cb15e854a9476cddbf7126c9de2fd70f67beaf2ebf6dbc5c0100000000000000fced8f1dff4f6c6852b0d643e26ee532086e72be7aecee28d94d1d59b5f9986701000000000000004a905d0574cebf6e8d00d382b104fc8ee1c008f1b9ffa6fa5c3b67ff29719c0d01000000000000008c64cd873a53fec10c4624239ce35d31d4422e32a109605a162fcbf632427733010000000000000026d7422872cbf4d4918046f240a13a37219a272f4326b3f3bd1249829bbcd12b0100000000000000be6106f9217a1847af66de9510fdfb40514409556506ddc1c1a897818434125b0100000000000000da98e4363908fa4d7980fe5574ceeac74fae49bf77b3a191654c7731214a565e0100000000000000ae2e94f092fbcfe263519f950b5ade09c474258a4e0d5e62570d02b3f71d85480100000000000000bca6409d6d7e4f94ce797594db4363bb8bebd5387770aee0bb7663b36354fe2a0100000000000000b2518044cc31062ee50fa81cb6983f314291a0300865fa5cfe149829c5050d24010000000000000086c1922e4ed392d72e0fbc0ee28e7ec0a8ba2b33470330a606cec9a159a79626010000000000000036465f4be77147914969ea78f8e39610310679011dfbb6137dab12e18a687a5201000000000000004e8cc21504fda961cf1cfe78e651d033b10f8ab1a4a0c757bd4848a7f2827f0601000000000000004ad8fedb395dc0ed63e0edbdbd2d20555b61a46aa7cd751e4308335c277cbd6a01000000000000004c5e6997b6f186855b1f4c9f8ab2d6cea3da2e86445605ab89e5b5821e05bd3d0100000000000000a6cd7eca570e90e2efeeda8f1c09480884a073c66fc7c41b2464e11822b12f0c0100000000000000944ad19383a9ae136f4f11c15687923b9b21319efab021336a3e8f2bd5b5ca20010000000000000068508b2ca3e01d7c8d79d99f1bb06a93058d14f1061d5fed4df13d4bc30aa557010000000000000074f02ed037d28c883df643034a596e4d2a97a23782ee8483c9ae3429ede7e7090100000000000000b045bf0235bbe708e4d6918758650c9c7f9ab4d638e4a841807ed7c82ff7f63a01000000000000005c252543704920d6bea67453cdd61b464b001badf73a3ea3b9e9fb35b224947201000000000000006e7a78e9fdfe275f3e000382ba30452729970578258839db6c0fc568e20b3515010000000000000004734733edcd9cf662389208fb8ccb5f274a7db8187ccc53dc84250f8599d54d01000000000000004e1b48e67c1e62e46add39fa523b956946228ea0f08bd9d20ced798cfc9a0f5b010000000000000010fee28789d45569ac0c95b7287fc7c5f087d93516cbd06e3c074a392d86da300100000000000000faa6ae896c2d1040e495acbdcd8d90a02ccb17ba6e507efa2f7deacb3b28466e0100000000000000840290d318350bff32db3dcf6138b822cb2adf1dedf5bad8729471988955915c0100000000000000907ff7ac1e6c451d236c05c8d3f85640d9f9472d6a30115fc26135dae020e6380100000000000000c264fe63e84cd004530d2a3eabdde5098fe5c6b619af7fc6c9cfeba01e75ee5701000000000000001ec005e9ca3c15b2994641dd22efcbb20032f10894f76f57296d219dc149817b0100000000000000a07f151db53097c2da9dac4b2e0f194931a677a3ba99df0f3976e34409fd64760100000000000000d8faee17dcc461acb22ca1720b86385414ea8810ba31509fbd8da8733029eb190100000000000000b071e9d6b444a555e034ecdc4d04f2528cc36b347b231b33388564a40fd32b2c0100000000000000f820a8ed2c97f639fea2892d0a89ae98ffc4c0054f948f9a0108e4d99f89994c0100000000000000fcd5f4c4fe11f20ad99dc8345b7dc5600caba5d5b7d3f499c3253c095152d45401000000000000005eac8ac37c95fc11921839550a30ef071bbc80fb10ea1482cc67818e184d544a0100000000000000ea2b17bd1b69a7b442dd000db0f12f0bd4bf7a87a540427986bd32f3d3bd55580100000000000000142445d894c1236a38c6b1bcd9f5a7245897026424ce9544002008a7702c3b1d0100000000000000d6acabff06fe9a6ccf02f780f33902672fae0f038d8e19ee234ce28a0b6a01410100000000000000f894d159aa4b63402119985e2243e77fc35787fb086867659412c8c6918b2a670100000000000000780e4353aca40b0f2b2403c862cb33032d49a820244bdc2853ce158d48c4f61001000000000000000e2daa2ef7884bdc7ca5f843f4f33f070c790e9a19d314bceefd04622920216301000000000000003e8394db87d36ddce56bfe0b86922dcc9a86d1ba061600e22d9694027b18c8400100000000000000c60a9f5f89ea3a56499bcd39bac7e038c25f5b7720d873fdc12b68d2531eb650010000000000000040b77fd8fcabe868dc7f2a08bf14c67e4d433886c3cd3738d1b0b9c649bafc230100000000000000cef0feb2602582b96fec882181d34bd5504645c544c983b1a962188239eed90a0100000000000000b633c47d126eceb0e36d788370ebaa179b0c7a3a21cf5f1421bfac40c895ed3c010000000000000092ee092cd2215c7c1628086c08be10a3cb969f6b276f600422f3526f303bd878010000000000000024190e384934261c444897054262813c65a73aaf371806db97762e995e5b350e0100000000000000020d34131c7a0ab6d104839ed8b9e0cdf075b80409a36fbe94d0cf83f7ea1f1e010000000000000022333a4409728530184f55b95171d2ddcec037603382fc7d6443b1f7b96c813601000000000000009acfd215519f40156749868afc8d56e015759f71cf183fe68382e8c02c75b2510100000000000000f44b3ec5c7b2188f208d60d159d1f5b0914a51a0632eacea6b88ec7b26d6673d01000000000000005ce79c3ad8a0e1806e863f0858c28a81408d19870a62ac0316b3e6345cbb5f76010000000000000006451fa7b2d831264e40a3e5b8452ede10164b7162a0e93bb9789a102c3010420100000000000000b672ee2f0f9183585ac4875368a0defda6d3c81927fbfc34bbacc7481058cb4b010000000000000022a66dd6397c2631df509db3482baac28b546729e6ce965472a9ba2e648ccc74010000000000000082bb250beb58df1c5346dc5dc26dbc38647a59fcd5c220c41466606cd855a2520100000000000000767cb742c94b22fff80da70a4ea77069aecde7ded53fbf5d957b01196924cd2d0100000000000000a065f45a353f24ba187248aacd9c64d5c3a92ddf92b4a5c33994f56a07cea840010000000000000078c91c4ee02089ea86612f66d6022a0cbd54afe470a162a72036611623924f6d01000000000000005432de09683010f3c1a6a977dd0dfdd8c5ce9fdb85225b9b7dc8e451e340cb240100000000000000464cb5dfedc6938caef6caaf5a58f4925a295f24a4f37337033dafa0cc733e66010000000000000016f34c9e6687012c42f9c02de75b9499849fe771f2ad2e666f965dc6627735540100000000000000f60b5e74957220ed7664befb71e9621436e40f2b6c1bdb1c90a6de9c3540a84001000000000000002a98fbaf7ec22832522e3f96821711ef684283911a524960efb14953255baa2b0100000000000000fe0af833307f4cff497d006ec63385b1c191efd6a4547fb05a355cd23686dd0401000000000000004ed5f55ec45727a57e2d8d6914f6d2acffb17b9515d347ba045067502a0b140201000000000000004cb98af1a70e917453f5dea682917e7b3077ea9d41dda7764433258a9d5db54b01000000000000002a0fda136ae348db338b87bed349145a94ce091227774b0542e533a83d1ba455010000000000000036c5a061b47768957b2b939b2e37e4cdf8825a4abf963c4f912f3ba4cd567f1e010000000000000076fa252aeca5b108fe76ce12e395ed8105d5c98e4abae38bfc7cb4fbd4d43d5501000000000000006a5607bc375d7ac0908e7643ea2e89dbe42f4f805c2fb6e2a22d0385c1232b310100000000000000f4ccdf83d734edcc568462572abaf32d22ac7faf8000195e02273d1c9665430801000000000000007eb2b0b6adbe5a5bad38f46db207f94c896d419661f4ab8f21e302a543df9b11010000000000000048ce0aba6f1554e139568b4d2358d6cca9bc291d3600787cc3e732291002ca2201000000000000007a07e4b6b4daf45f4af2a98e7458034447ae0e67e9a22596848e58d4ba73b9530100000000000000fa30595578d5e253a0a3701616665cb205fc02eb560c023454c280bfc6cd8d090100000000000000c4c5fe47a568c2fe4876eafd5e0093dcc31b450eb87bfe58397dfae2a590d4650100000000000000c670e2b0f864f126be43807610aab3295cb4ed6a684d95de331d700f74e2985e0100000000000000fa5a4da949ce29dd0fc20fe56c40d63ffded8e2dd88844f725efda0814ed526401000000000000001cc40fa83cd0a4431aa63315b55c669370a4037756089f3402a9021e2d8066640100000000000000742c0a1ea78a09c7454b48897bfde87bf4959b89c898623c8eeace7af714147d01000000000000003ce775a4a6215dbfbdc2b0a8a8b71936abd61642b5fd1a0c1d06ba548ad3025e0100000000000000bcb998778b7c2c182f396b311f92ae1289daeed9e62a3d8a8298b8dde7e1a52401000000000000004a1069d2203a75cd1078c39de35c16a6c4c12acbad34f1cba8efc065f80398610100000000000000cebdabff22e607a75aa8db1bf875511a563200cce3f089972aca719649b6e176010000000000000062c6c1f6f2478ee092c958842ac4351973bfeb49f55e33b8415ac0296a967b5f01000000000000008a6dbf87f769167b4eb982f63b946f96a1f223b6a6f2789183fec09581b8e906010000000000000056927fdc8bff2063e108fe1b05bbde2f6219bda7d8663fafcf3d2976c721535901000000000000009a64daca74d14dab93385e52ca70940732a8d45ae4b853ce156c3eeca06f0c5f0100000000000000eed7e8e8a64dfa89c548a31c1b9fec7af5aef4dbbdb26997b2ddca72d4f8790c0100000000000000fa49d3457520dd98ca1489b78354d7d30a9bdf2181140072ebda1c3dc3371e450100000000000000fe5ba24461a8be22c5e553d2715748ece9c50a621d1794e36ad6c40dcd5d9c230100000000000000b2ddb9eab0545b9ac7a46e37d6fc4605c34227d848416bd3637da7156efe612601000000000000001a15acd9aec8d1dd06c7b6a46be298c3fc2ecd51be6724a63da4da286e306f72010000000000000078cf1debe3fc0da2ed2473d1e1835a478cc3e7008e0cf42043f287bc36804b710100000000000000f853a1534a3af56217661420536dd7bea0db6f6db843d8fead77c308ed7dcc7c010000000000000032e2c97e308c84afea4b37d7dd8f62e67763126c357c9e6e49b27f54c3702b73010000000000000050d2e3ed042861cfddfecfb31d47caa1927064cb0372213a3015b2acdf1dd1450100000000000000843778dfeddea10578fab2773f2827c62fe0efe374d9a01eb370bd8f1427e7630100000000000000140fbeeabfb02dede7214a17c2cf78279d076c80d962431f35d1105c87b8d95501000000000000007cb1f225b90c00f426c33ac4338eeb2dae6467b8a9da5c1556e6588c12ca977b0100000000000000b261a66b9bae17b65e7f6a88d65efb4519925d6c418c9e2ba17bfdbf684b776301000000000000009c5d3bb1387f53f0306bf7f24e81dafa5bf972048de867e2e517938c4ebdf7120100000000000000560c91919fc22867159ed77bee1b3e70d2e222a5fe6e830fceb13b58b0daa5290100000000000000e03e94cd4419d9cb8709ad2859e598912c78c01b15eed53ec0c336d8d6c491420100000000000000ce60d2c987bbeeaceff8463484b717ce80cbcf3d8f8b2102e95effc88000d95d01000000000000003227028def74f8ea7bede3e112e4ce09d8fb823790ed599f2259019945f2690a0100000000000000c686fbbc968476537924f90aaa4993eef8314685d150228c462f8ae4e5e1e57f01000000000000004ca838afa9f12e88436eacb5024f3f94c95a66c32e114f65f3136176e426c75501000000000000000c60356c02d5d99293952c478fd07b2cff982dbad863ebdadf25c9e69206f14901000000000000003a8b589c8222ede45b3d95c8d9176543ffa9a29cbfa0ba2af60fc412e732d75e0100000000000000a43b19f13ec057124df240aad303e969f7d02fafc02c263d7ec814b6729d1b2001000000000000000884c85734b971a88cd94d86d3c62fdf163256a0387e15e2d36d8f25523a77480100000000000000f2cd13ba1efd67dfd5f8c9150b1a74d1ed1bad1a72c36fed96163b062e463d0101000000000000002001d47fbff7291a50650047b27cc47f1d22a0bdfbbfb0b8b7a6e8bbf350bf620100000000000000ecf0297bddebd3d766ea7def2bac79ad6eb650fabdcd029b99cb1649ff7dc8150100000000000000121f9d8ba85d89e3c6f9a0fedcdfc9b05cc40a6d3324eff6e8a58aec5f52590501000000000000008a16fb5a6718a714296cb8fa2ca708f677f78c7f883ba3c5ad1bbb9e23f37705010000000000000038c9a0897d9caff03a308d2120bbe892974ae8cb05f1cfe8b97259f0ac2e852901000000000000003491cc113ef8fe1165bb10e65cbb461955f92f8f0d82f2dcfe6664430dab853601000000000000004e466f6a4930d856a1f53f21c1a44451ead20c8c71319f6a685f0e254d24c32101000000000000007617b69110c43683b5000788259be855890c474be8fed65d7b1dae1d534ef85c01000000000000005e0fa84f762f7d6e4c4b0c18a86e1b7da6cb4fe7dfcf6b5c0056a7ccd8eb201401000000000000002037d70f4c244c81422409ad01d28d72a30d26e595fbcc791daeb57f78a8567001000000000000003cfa50228b841c7d2fab03db7e4bf282cf14e127ab9b31c23fca1a79be54e823010000000000000088fa8bb07ebce99964718c65d0d6f1b091ef2f4d4cdf7b94a22c42c007ecd706010000000000000052ac28ba2601723d23a086b5d775f19319f110ba5e9292f2af461e71903b5b50010000000000000002a4b2935b657f9ec563642ab0f34e223ef594cc70c856b9bd70fbe0837215600100000000000000c280e82e46ecabc4d68169e292c59cef96432f25fe849b8a147db5ca0ce7e17b010000000000000092e5bb9d0906f768dbdde0696b78e493cc78dc1f68789575b24f0b962799b51e01000000000000006ca32996225021dadb0b3f22460db6ce243faa3a0df7b33ef28e5fbcb9cf6f2f01000000000000004a512ac212da2c96d7bc8590865ce627e6b60246700595bb100b240e80a3f0760100000000000000f0c0cc64f8973ebc2322273e684b4f73f412503f124c130be0be1589718cdd780100000000000000322dcdf3a5f50091af8b876983da0e0e98e358339e6033cdb865cd64995f86130100000000000000b63f9ab3a147d76614bfb688751f79fb9a120d40af7ba3bb123c1957b91a411d010000000000000010e37a12fc6ed768d1a2d33c8abc6db675381dfe69c832abb77d9ba2341b3c4a01000000000000003213885ba6fd707b0716aeaad959cd824ab2f854e55963d9e69af006d194d51f0100000000000000fa1b0afc9ce9e9742c4825890f6d93bb87bd199e55e86ce66ba7c34ce43e273e01000000000000008013bf5a25c703e64dc4ae7e1248c0f2c7abad9e43672d82611d109740199856010000000000000064214c3864c6011c684c9189e62616eff43fd4709c37755b41d432a6ee03fc020100000000000000188d1a45dca0c370ba6b7952ba682570fd4f61501c4dea9826a981374a3f815f01000000000000004c1dbdaaf0fb061228d2245561476088bc608788cb3e9c5266f5a8e54bdd1e670100000000000000d23c53a531e356646133db73065cd83999693a5bdfc05931238434f5b031522f01000000000000006a40a8b74a142958efb2d75cd363635eccbfb70cddb24f0626d0ec927d98233801000000000000005e127fe875a9c6396693b778833a710b0426a4fc0af4af490e7ff0a6f3e8b61f0100000000000000aa74176b5870c97b754a157ec0d8032148c2ae717a905e0e5e626048b6f5334301000000000000003e07b075219fc7ace8dc3bf3a06f5dc12aa9c7e45fe30244d2284bcfb1e6ee190100000000000000a4a0bc81aaad1ebce3fdf896a8d6d081ab93efc2de9d5c56f2632edfeaa7ad0f0100000000000000465242c8915eea46e25549f2ab97cfe78784f25083e51773e07d5a0cafc2de32010000000000000022376791bf19fefac611324d27bc6acb4b7f7eec713c186adbeda5a1e1b88f340100000000000000bc8f93a45201992fa9d04355095d03adeb5ff1aea206425eae4f902ffd47fe200100000000000000288c08430a7e427400dd5b61926b74a82abcbbc91ac739190cc791a581f6836a0100000000000000eec1df2a382f2f9d0e7dbd91ebffe7be19dc9e01159cf3b82229a3ad2a33685b0100000000000000fecb15325d9baf603112dd397d2e83d3694414f529d75c4b639c7e775b979b14010000000000000028052d0b965ed862b7861aa7f3f91fe52ff8b0f795ff476c7e0a7aa42e79933001000000000000001c860d36fc84a54978d99ad400a719dbbef493f8631856e6def3e9ec998cde3e01000000000000002ef781a1d268b8afb0a8331ece83f3fff6877baa2d06ed9a23d484d5d70a5003010000000000000092cca18f264bdcfc19e5c01515ea9d61a0bf0b4e46b2bcae372a428b9dc35e390100000000000000e0b770b1bcf7deb030ee75d5bad6ec1ebfe06ded0fc406a8520a9650fe832330010000000000000066a5a598bd5d484fe66e630a3e57f3b245fe0413f81401d7a5d59aeed1a3a46301000000000000003622bfbaf9350b5906bdf9ce362e06726224ed141c5d29e8e175e0beedbd3d3d01000000000000000469db5710f30dc9ed7411417170efd62ce8bbe36ccab6df758a94aa7b7f720b010000000000000008e80cc5ada5e557a1cea3658402bc83f9892b5c4e112b6e157e6e7d3663c47b01000000000000007836067da2bc290dc3c428c548a4dbebfdeddbc10a2db206abb6ac11741dc63e01000000000000006ed90090a744a0d55adf8f8af5af4d5198bb67220ce33fe71121d7c51f27a4130100000000000000bc20aa968087f7c0d4bb35dd9c502db39fd7f4596a412880fdcd5ddba22fcf460100000000000000ea82745d9978e47fc6bb25fc01383aad42aeee65662b6af304474f0e4101b06f010000000000000072f2ff3d21f4126e217f10f9d9bd18069c12eaab6922d073dd5241ac718e91200100000000000000f25d3265659fca9d24ca877823644f1223714b0167d0a676cf3c9c447173d12f01000000000000009ab493c4c8007f49a3e7d1e9f1aef39b39cd66a496e90486e62664725c6ba06f010000000000000094cc8c46f9670417f5ad9492d17189c4e03e96122782e92824f05e176d6843790100000000000000369a7419ed7884aecd3cda7ec3576942cacde7a9b8f2fe9a1115be827e2ba83b010000000000000096ef8b525c38b9a74a3014bd99979230dab2f20221e8c7d1db50c7a61a02e97e01000000000000001827754b7465edb9bf4ce981bdd3a33057f9450fc895e39654dbd51c3ab9835a01000000000000008c45a06f479923e10cc400ae1600234f85906e26195bde9023350efaf0bc622c01000000000000006053f4e41a4db1dd6ddcd2304b62de45cda832c4e63a831ce9e634fab830d40d0100000000000000f2065428f52da2f7a881f9b94bfd38719bb6e5ff88a6800bbb3aebb1a9ad21020100000000000000104b3d784f0ae26bf3268fb7342a99fcbb1ea61068e03337df050ef2e0895374010000000000000092006149452119964a75232851f01361608dc0a52031f240e93e70e98a3ff21901000000000000009ad36892ec05281de9c63c7cefb3f31e448957a9572e650d9f3af1f21b2f515e0100000000000000bae8e68bc8f1b66fe3229ee72d77137b394c6b7dfbf55e424f9d2c82d5c99600010000000000000098f7988d5a74a0e52f58dd3d232ac3e93ff757480db9d4c12761b04fef032c460100000000000000248cddedee20dbb65f20a1715c2490c09241f6800b72d0c4029a1c234f2ce74b01000000000000008ca0a873b2685dde8c4792832cabe50ea5a1f8a9a661a336689859319b66ba6201000000000000001cf3abc7c9d8027488ea2f5f2463fd091b194fbeeebf560875e8648fbc67dc24010000000000000060b521110672f6f871978fd3ac4a835b5e30c3fa727c04c70dbc543fcad38b0e01000000000000001c103b038f0515bb77061128200e1f117a531cb4474cf5f9430535345f54196701000000000000002ab0b5cc358184be4fa29e7a3dc24806a72e55baad40ec9a117324a884242c2801000000000000005afe620da258a48f00c3afbb8a98161e977f076c7e7f8392975a4f0db4b57d6101000000000000001ae9aab4a890c558ac8ab90ccbbf193b3841083670ebed278b2161fa2ec7b3040100000000000000c2d156c96e21691a06cecd4a396978f94cfb3a1760d41180efe382b7ce8e993f01000000000000004616ac86f0d45899eed3f1246dc5744858a694a92b0abd9f10e52dfc9c2867460100000000000000a4b31af719e5d9c3b69326ef920736e8b620b329eade475ae23a33fbd445df7201000000000000009281394b5d35827c826e1d7444f346c247b9a004aa0292a9ca2b16e0fb55687701000000000000007e88cd54f47c1f4ddd9d3a198fc689d24a523fe186d526b14e476f14ced7db3c0100000000000000e6a08fa6af54d2308215f4a62d554dd5b82deaec8ba22a2e6ebade7202ab9e21010000000000000096e0b71982f3e7ba6ab06d28dfbf803caf4ac51b7633bee848f4f3fadc0dac480100000000000000068245d8a483bdbd4e9d88b49e17a651ec168f25e6851fc52c2e36a516031d5e0100000000000000386bcf52f4c464e6a18169f776d69e90880301f01fcc8cc0ba451f1d7e6c3b7c0100000000000000dc1d6d9b878558829a87267a578e1d044b2033888074dcc3a9fcd69cd5e60d3e0100000000000000b41546275611fa185c88c7016e909222b3a757b476316766a72729d074d8e92b01000000000000007e0da5500e4e91faec6b7c3763c52058a7a9350be3009f2fe00a8e3bf0c59e790100000000000000a8d082a4289fe5ccaada604e70c4b1473d6fae4374663672e61474852c1ebf2a0100000000000000309ab613bea03c4431f7602c937f5a4d17e2102db6fc7f77e32f7a245041b90c0100000000000000e0ee8ff76b364ad2ccc3e82e69cd700c0895607a449c5af3745bb3018a1843220100000000000000389a3d1a5e1e8099f5b05213b5e20bf7f80c50e945831f1309f1d0623dc514e60100000000000000040000000000000002ffb5d0e61bb7150459291768cdad47428dce5d980d4975c4e1e21ad0b43a059fe4563001019d20000000000000739efe10000000006009000000000000a50432904ec260963195582a1d339f9fbd2d5d76f551160105c922423cad0d94482f010000000000000076441c448aefcf40a72128edc9b44a4f7ef9c267c503e98f5f9c72d5e9e92f000100000000000000526e055ade4ac425e9b5f93ce4394601335d3599a5b742603126d78ce99a4a540100000000000000d0e8ddfdeacd8e163b01ca4da1a4e856312b0de412b492247070f2721f7d803801000000000000008008c1b7061a2402634fc15d3849e2913863beb9f55024bc8cc7fa7d6e397817010000000000000024a51a9bdb67213626d1b52bd8dbc0e9b94ea88ea417aa17b56212d1cea3e1780100000000000000488d520146f681678e9d229f5e29354edf65e521246b28a4175c0502e060b9200100000000000000c681c1acaa82eddba6e394ddc9a2fd1af34418448d544c34966a31c837667f280100000000000000ba395fcb33327501109ed40712c7a372d25bf3339edfabe2a1964fb7b5d4d82401000000000000009cb389c209afbebda2b12113e0266b3d30f46e2a91aaf4451c193d640288357101000000000000004c9886e2e62ee92a6778d6a7928052732044b64fa61969cd8e37f3f7e3406f720100000000000000c056f1879c1fd443e38244c26ef138218b3e43e70b1cb84bd7242e354cc9ee0e010000000000000026db7c5786fddc15f7e96905024905d877537451ed444cb97d3786361a59f64b0100000000000000c67b1b3084dc3eb2cc7a3cc4f742defc21b733e787737cbaf3b146a052633e0f01000000000000005237e4509f24bc9e8bf9bfd78b594219d86853ae16601f692f10c9b16b88f83b010000000000000098192016f83ef2fe74dba1ecc6526efc61b79f3177c00dc7c053160391858f700100000000000000a6f10752adf745ad55866031836194ad027ed8d6710d9853ef62982bcf45fd0e010000000000000078c35105ea4cd9d6ea0ba91b2c19e78f60931bef5918c1bd2e14259229e7c330010000000000000006d2846642c835b0fb1ff1ef908449376aa8e7c0f3352e55da9a1e97e9528b230100000000000000f8a681118ea0bb9dfde2813ce5144eeb5cee881c27883de1c0c759255ec32654010000000000000000b84e6e296de1009aeca95ee09bc5173aec6e91b1145b247d69e47758878972010000000000000090d25f2368ee57fb5c100140b7507d5831fb035e7632c53b532b65e6d14ba8480100000000000000e67c524e443cda4cd27dfcce70488a5d23a93c8c46a5e83ef5a69eff3a02fa5a0100000000000000a42289d68c963358f3c450a850242bb53121e73e17f0e2ea2b93327446bea33c01000000000000006c50859d9dde209012eb3868c1a3a6e80ae8fa528ace9df68e92dbbae60368200100000000000000a8e470f2339e3ed0da456780dd9207e9c6a02459238ec3057a6ade01fd6cd60a01000000000000005c7f05d77f853f3eb8d4989fce36d0808b6d2b881e26f13c01e939b5d489a57d01000000000000002addf696d5a42b0a3dada689731e00c991db936909df869ac6600662abc35310010000000000000072ed7192625403acef94aa9189f9f179deb89e60478816ca96c79b742f757e750100000000000000b4ffe3c5959ff37c11c6f19d91926cb97aa4bf0f604919e1753bb55664d061680100000000000000bc4c9b5425f9a2aa09e3239332c702dedbfffa2b9f4cc1b978b307fc1fa1337c0100000000000000e07d5b19d98a6f8ef5c964b507fcd88f500a2a0a9afd5cffe9d4e3f74d83b27f010000000000000024532b17fc5fb786660c52aeb03150799165dd05e88ce359189189a4b771f51e01000000000000008610e1f00a1eba67d13225867c1f2972e60604e49bea7e5c1b10b29d4841b84a0100000000000000be18787b5177e58664cd893fdaa20a3ca1bc9f1acbbb15036b046ae49c17c15b0100000000000000acef6dc8da16677955c38451be5a1b369fdc3c20bc249a1aec917276dfc2da580100000000000000c49cfd152ce3ac1fa142b3b6e720cb173eb7f43c82f021418253a070036f870c01000000000000006ec27dfa7ac9d35eb002c55d3e4d56b4df928dd5c44323ac228305741c9e09360100000000000000b89cbc83a386d6f5d4fed93289ee50fdf69d77369ca0c9a8b962554e3fc0d37e01000000000000009237113cf97fee5fafbeb82de593f6125e9c498bd59f0369625f46b326c7d9170100000000000000722d7d57085c250af633f2d461874d59aebc8021eb1112ec8805db5ddea53e5a0100000000000000a20797f3a8669a909adb22a3aee2844dba82d231cc33f5d9be0e2c533cb82a6701000000000000006a1274b6748bf822ba80c9a9416abd3cf591b7aee6adabb8359b7dbed8ebb3770100000000000000dc1274e0689c7a3eac31b41ce352719529e65c01f26999f74ce17c9905fce87401000000000000009c9bc1074cf465c0dd39f74bfdf16a67f81339ba2ad117a0c7030b4f0678771701000000000000005c0494412a296a92296160ac510697d97288753829a5e9d02eafb5f101e60f510100000000000000d8b38c77823eb1912bf8b743cca6c655ea1844ee468fbd78b394bf222bf8bc2001000000000000007251d6c376064f07f27d2532b05c091bd0978067b078c9f8d9984fd4216bdd4b0100000000000000487c6aad1cc26893dc7e498916a4c23d303f098c04b0a8b0c8242fbb7e73a16e010000000000000088f9a16886165d00612032cb1b36669ad62b7325536f499191e711134c71b6070100000000000000bc4b95226de4e10f91e0254cfe4541232252deaa347f567df124aba81bac4d3f010000000000000032636c64cae326ea37dfa4ddad688feb9829ada7a7d580a91ce03a50a673d01c01000000000000001eb833e31087d6baffee4e7f1d9a8e3b7013ea392c81f74313a354ba82e92f6b01000000000000009c8c7c8c91df0ed53864f69017d530b5ebda3ab4bde3c67027e70893213d533a010000000000000018ec239eec5457ba11a41518e7c5f98266d1bdbd67602641d04706f95dba5c560100000000000000c65c0a74887e9fe5cc56696fac7e7f5f1cd4a68f9661c8384b300bcdfbe67a1801000000000000003690e6ef639f685849ed93a6386d1fccf026c3fb64520940aa46af97f929e112010000000000000028a027ca1c0bdeebfc8fce85ac4bac48cc072523d9c4a86b4f2594f9142e7e3b010000000000000042e4c41a899dfb238649e5b17dc232c2699353635d60e6a3bdcd71f9b82cda300100000000000000ce4bfd8c5611b1637066ef9e579c85efadfc9513b882184e00b75871ef7f5a2d01000000000000005c0419f37036f2bf999f3958b49f63ab19d6dc19847a393dfd26cf303fc8d911010000000000000028558e46037c51ece4d39a8a4d34688662e629413c221d6226afe454240e70210100000000000000ee82f2670e36b9ad136ae1ab1607c35f3b49a8c93b86802c06df3ca62a2e3561010000000000000024a0c6db2090170748a7bae71b6f77b5dcc14c6acc5c58e8de78d317ccafe14401000000000000004a2073ae31b3df10d285eae6a5befe069183c4c6a6ffa1b2bf432011d0d475200100000000000000e41b3ecad757b0a5ecbc6b29691681df25b3d2b5f1ea325b648e607a5d76cf0801000000000000005461977495f9c407a8d951e860a1cb2087592103229bdbd879629cc538a4182b0100000000000000b05ad6cde0dfc019d740c3f50b8aac16550ff4c197da19cf23b9293f0c5c39070100000000000000bc56c07cea21bcbbe058aedd2ced9fb4757caead55f96bda9bed1c9669c32b64010000000000000078e1a4fecbaac940c04e0b591a01ea66a574b5098852ded2810e3a534971111f01000000000000006ccf2ce8e149999a7bb996faa65194e60aeb7bcd1937c787f886fe979fb49e6601000000000000000e5650026c7bee4fa43a2c7fcdc3452daa10b0530863ec686b1d5ee4d707600501000000000000001e866bed92016cd2dcabe2d87fcaf8c1d7248255cafb9e10638fc3a2b476221b0100000000000000946071eab9c0fa1de9be2ad3c18041f1326faab41d84d9daf9f89c0daf9c0f00010000000000000082b820c5bee8ee77e35203dab387f3434b8502e5f1c35dfb2ad15b5c89d47b3c01000000000000001cf3446b4b5116a1784d92cdc5101e55a5fb91ed3d93efccd06b304a94362d0a0100000000000000c6d5dc6e1ec83491397390449d8cddaa88631e8855efe50697788a93de00fb550100000000000000220d3f26072ad42aa5ca04b7253284d185f8bf95650faa170cbda8d7a47ea84a01000000000000003a4b0919068523aa04ab29f1b49bdc03a176a4b93f9b5a7e6e0cdcc8318691030100000000000000b288a9832e07bef83c5a8ca72c5a5583b321672ba7c6cdd44a971f855d32d95c01000000000000007480edf84ab569e559dccc99b87ecb9ae9db670b45a259b7f6e618b063e43113010000000000000020bedd48a5965e2fc0e221bd164deecdee849eb69cb8dc63a37df80b50a3093b010000000000000026c4a27200f70748b52f7277150d2db7e192b258d5001412e42c62c6e3ee1e5101000000000000004628f93047462b43ec0886f2c7d7318ddad1764fd32af4f32ef0b2dcfa4b297a010000000000000040a2527ffa7d30d788eca127d435c8b5aa48972cda538b9a1627a57e85c8fa1901000000000000003635c55546f19bfe62d84a220c4396b1c9d71a1acdb2da917a82f0c1415a2b020100000000000000844b691aa95ff9a15b50f5e5f4f0e582db6621326cf18d7533f55bc27549497a01000000000000002254fb9324a6a9af450ce3a4f5ab25f55deb22161e520b2308b8aaff42e3aa7401000000000000007c4b93d862704aad434ab3dc2cbef824df738c5dbe1ba7b34daa38b2aabf7c36010000000000000028e972febaf463f22d1108053e7c26ccde1e6018d7c302985bc227557e0a663b01000000000000007c4f928b915062d9cb15e854a9476cddbf7126c9de2fd70f67beaf2ebf6dbc5c0100000000000000fced8f1dff4f6c6852b0d643e26ee532086e72be7aecee28d94d1d59b5f9986701000000000000004a905d0574cebf6e8d00d382b104fc8ee1c008f1b9ffa6fa5c3b67ff29719c0d01000000000000008c64cd873a53fec10c4624239ce35d31d4422e32a109605a162fcbf632427733010000000000000026d7422872cbf4d4918046f240a13a37219a272f4326b3f3bd1249829bbcd12b0100000000000000be6106f9217a1847af66de9510fdfb40514409556506ddc1c1a897818434125b0100000000000000da98e4363908fa4d7980fe5574ceeac74fae49bf77b3a191654c7731214a565e0100000000000000ae2e94f092fbcfe263519f950b5ade09c474258a4e0d5e62570d02b3f71d85480100000000000000bca6409d6d7e4f94ce797594db4363bb8bebd5387770aee0bb7663b36354fe2a0100000000000000b2518044cc31062ee50fa81cb6983f314291a0300865fa5cfe149829c5050d24010000000000000086c1922e4ed392d72e0fbc0ee28e7ec0a8ba2b33470330a606cec9a159a79626010000000000000036465f4be77147914969ea78f8e39610310679011dfbb6137dab12e18a687a5201000000000000004e8cc21504fda961cf1cfe78e651d033b10f8ab1a4a0c757bd4848a7f2827f0601000000000000004ad8fedb395dc0ed63e0edbdbd2d20555b61a46aa7cd751e4308335c277cbd6a01000000000000004c5e6997b6f186855b1f4c9f8ab2d6cea3da2e86445605ab89e5b5821e05bd3d0100000000000000a6cd7eca570e90e2efeeda8f1c09480884a073c66fc7c41b2464e11822b12f0c0100000000000000944ad19383a9ae136f4f11c15687923b9b21319efab021336a3e8f2bd5b5ca20010000000000000068508b2ca3e01d7c8d79d99f1bb06a93058d14f1061d5fed4df13d4bc30aa557010000000000000074f02ed037d28c883df643034a596e4d2a97a23782ee8483c9ae3429ede7e7090100000000000000b045bf0235bbe708e4d6918758650c9c7f9ab4d638e4a841807ed7c82ff7f63a01000000000000005c252543704920d6bea67453cdd61b464b001badf73a3ea3b9e9fb35b224947201000000000000006e7a78e9fdfe275f3e000382ba30452729970578258839db6c0fc568e20b3515010000000000000004734733edcd9cf662389208fb8ccb5f274a7db8187ccc53dc84250f8599d54d01000000000000004e1b48e67c1e62e46add39fa523b956946228ea0f08bd9d20ced798cfc9a0f5b010000000000000010fee28789d45569ac0c95b7287fc7c5f087d93516cbd06e3c074a392d86da300100000000000000faa6ae896c2d1040e495acbdcd8d90a02ccb17ba6e507efa2f7deacb3b28466e0100000000000000840290d318350bff32db3dcf6138b822cb2adf1dedf5bad8729471988955915c0100000000000000907ff7ac1e6c451d236c05c8d3f85640d9f9472d6a30115fc26135dae020e6380100000000000000c264fe63e84cd004530d2a3eabdde5098fe5c6b619af7fc6c9cfeba01e75ee5701000000000000001ec005e9ca3c15b2994641dd22efcbb20032f10894f76f57296d219dc149817b0100000000000000a07f151db53097c2da9dac4b2e0f194931a677a3ba99df0f3976e34409fd64760100000000000000d8faee17dcc461acb22ca1720b86385414ea8810ba31509fbd8da8733029eb190100000000000000b071e9d6b444a555e034ecdc4d04f2528cc36b347b231b33388564a40fd32b2c0100000000000000f820a8ed2c97f639fea2892d0a89ae98ffc4c0054f948f9a0108e4d99f89994c0100000000000000fcd5f4c4fe11f20ad99dc8345b7dc5600caba5d5b7d3f499c3253c095152d45401000000000000005eac8ac37c95fc11921839550a30ef071bbc80fb10ea1482cc67818e184d544a0100000000000000ea2b17bd1b69a7b442dd000db0f12f0bd4bf7a87a540427986bd32f3d3bd55580100000000000000142445d894c1236a38c6b1bcd9f5a7245897026424ce9544002008a7702c3b1d0100000000000000d6acabff06fe9a6ccf02f780f33902672fae0f038d8e19ee234ce28a0b6a01410100000000000000f894d159aa4b63402119985e2243e77fc35787fb086867659412c8c6918b2a670100000000000000780e4353aca40b0f2b2403c862cb33032d49a820244bdc2853ce158d48c4f61001000000000000000e2daa2ef7884bdc7ca5f843f4f33f070c790e9a19d314bceefd04622920216301000000000000003e8394db87d36ddce56bfe0b86922dcc9a86d1ba061600e22d9694027b18c8400100000000000000c60a9f5f89ea3a56499bcd39bac7e038c25f5b7720d873fdc12b68d2531eb650010000000000000040b77fd8fcabe868dc7f2a08bf14c67e4d433886c3cd3738d1b0b9c649bafc230100000000000000cef0feb2602582b96fec882181d34bd5504645c544c983b1a962188239eed90a0100000000000000b633c47d126eceb0e36d788370ebaa179b0c7a3a21cf5f1421bfac40c895ed3c010000000000000092ee092cd2215c7c1628086c08be10a3cb969f6b276f600422f3526f303bd878010000000000000024190e384934261c444897054262813c65a73aaf371806db97762e995e5b350e0100000000000000020d34131c7a0ab6d104839ed8b9e0cdf075b80409a36fbe94d0cf83f7ea1f1e010000000000000022333a4409728530184f55b95171d2ddcec037603382fc7d6443b1f7b96c813601000000000000009acfd215519f40156749868afc8d56e015759f71cf183fe68382e8c02c75b2510100000000000000f44b3ec5c7b2188f208d60d159d1f5b0914a51a0632eacea6b88ec7b26d6673d01000000000000005ce79c3ad8a0e1806e863f0858c28a81408d19870a62ac0316b3e6345cbb5f76010000000000000006451fa7b2d831264e40a3e5b8452ede10164b7162a0e93bb9789a102c3010420100000000000000b672ee2f0f9183585ac4875368a0defda6d3c81927fbfc34bbacc7481058cb4b010000000000000022a66dd6397c2631df509db3482baac28b546729e6ce965472a9ba2e648ccc74010000000000000082bb250beb58df1c5346dc5dc26dbc38647a59fcd5c220c41466606cd855a2520100000000000000767cb742c94b22fff80da70a4ea77069aecde7ded53fbf5d957b01196924cd2d0100000000000000a065f45a353f24ba187248aacd9c64d5c3a92ddf92b4a5c33994f56a07cea840010000000000000078c91c4ee02089ea86612f66d6022a0cbd54afe470a162a72036611623924f6d01000000000000005432de09683010f3c1a6a977dd0dfdd8c5ce9fdb85225b9b7dc8e451e340cb240100000000000000464cb5dfedc6938caef6caaf5a58f4925a295f24a4f37337033dafa0cc733e66010000000000000016f34c9e6687012c42f9c02de75b9499849fe771f2ad2e666f965dc6627735540100000000000000f60b5e74957220ed7664befb71e9621436e40f2b6c1bdb1c90a6de9c3540a84001000000000000002a98fbaf7ec22832522e3f96821711ef684283911a524960efb14953255baa2b0100000000000000fe0af833307f4cff497d006ec63385b1c191efd6a4547fb05a355cd23686dd0401000000000000004ed5f55ec45727a57e2d8d6914f6d2acffb17b9515d347ba045067502a0b140201000000000000004cb98af1a70e917453f5dea682917e7b3077ea9d41dda7764433258a9d5db54b01000000000000002a0fda136ae348db338b87bed349145a94ce091227774b0542e533a83d1ba455010000000000000036c5a061b47768957b2b939b2e37e4cdf8825a4abf963c4f912f3ba4cd567f1e010000000000000076fa252aeca5b108fe76ce12e395ed8105d5c98e4abae38bfc7cb4fbd4d43d5501000000000000006a5607bc375d7ac0908e7643ea2e89dbe42f4f805c2fb6e2a22d0385c1232b310100000000000000f4ccdf83d734edcc568462572abaf32d22ac7faf8000195e02273d1c9665430801000000000000007eb2b0b6adbe5a5bad38f46db207f94c896d419661f4ab8f21e302a543df9b11010000000000000048ce0aba6f1554e139568b4d2358d6cca9bc291d3600787cc3e732291002ca2201000000000000007a07e4b6b4daf45f4af2a98e7458034447ae0e67e9a22596848e58d4ba73b9530100000000000000fa30595578d5e253a0a3701616665cb205fc02eb560c023454c280bfc6cd8d090100000000000000c4c5fe47a568c2fe4876eafd5e0093dcc31b450eb87bfe58397dfae2a590d4650100000000000000c670e2b0f864f126be43807610aab3295cb4ed6a684d95de331d700f74e2985e0100000000000000fa5a4da949ce29dd0fc20fe56c40d63ffded8e2dd88844f725efda0814ed526401000000000000001cc40fa83cd0a4431aa63315b55c669370a4037756089f3402a9021e2d8066640100000000000000742c0a1ea78a09c7454b48897bfde87bf4959b89c898623c8eeace7af714147d01000000000000003ce775a4a6215dbfbdc2b0a8a8b71936abd61642b5fd1a0c1d06ba548ad3025e0100000000000000bcb998778b7c2c182f396b311f92ae1289daeed9e62a3d8a8298b8dde7e1a52401000000000000004a1069d2203a75cd1078c39de35c16a6c4c12acbad34f1cba8efc065f80398610100000000000000cebdabff22e607a75aa8db1bf875511a563200cce3f089972aca719649b6e176010000000000000062c6c1f6f2478ee092c958842ac4351973bfeb49f55e33b8415ac0296a967b5f01000000000000008a6dbf87f769167b4eb982f63b946f96a1f223b6a6f2789183fec09581b8e906010000000000000056927fdc8bff2063e108fe1b05bbde2f6219bda7d8663fafcf3d2976c721535901000000000000009a64daca74d14dab93385e52ca70940732a8d45ae4b853ce156c3eeca06f0c5f0100000000000000eed7e8e8a64dfa89c548a31c1b9fec7af5aef4dbbdb26997b2ddca72d4f8790c0100000000000000fa49d3457520dd98ca1489b78354d7d30a9bdf2181140072ebda1c3dc3371e450100000000000000fe5ba24461a8be22c5e553d2715748ece9c50a621d1794e36ad6c40dcd5d9c230100000000000000b2ddb9eab0545b9ac7a46e37d6fc4605c34227d848416bd3637da7156efe612601000000000000001a15acd9aec8d1dd06c7b6a46be298c3fc2ecd51be6724a63da4da286e306f72010000000000000078cf1debe3fc0da2ed2473d1e1835a478cc3e7008e0cf42043f287bc36804b710100000000000000f853a1534a3af56217661420536dd7bea0db6f6db843d8fead77c308ed7dcc7c010000000000000032e2c97e308c84afea4b37d7dd8f62e67763126c357c9e6e49b27f54c3702b73010000000000000050d2e3ed042861cfddfecfb31d47caa1927064cb0372213a3015b2acdf1dd1450100000000000000843778dfeddea10578fab2773f2827c62fe0efe374d9a01eb370bd8f1427e7630100000000000000140fbeeabfb02dede7214a17c2cf78279d076c80d962431f35d1105c87b8d95501000000000000007cb1f225b90c00f426c33ac4338eeb2dae6467b8a9da5c1556e6588c12ca977b0100000000000000b261a66b9bae17b65e7f6a88d65efb4519925d6c418c9e2ba17bfdbf684b776301000000000000009c5d3bb1387f53f0306bf7f24e81dafa5bf972048de867e2e517938c4ebdf7120100000000000000560c91919fc22867159ed77bee1b3e70d2e222a5fe6e830fceb13b58b0daa5290100000000000000e03e94cd4419d9cb8709ad2859e598912c78c01b15eed53ec0c336d8d6c491420100000000000000ce60d2c987bbeeaceff8463484b717ce80cbcf3d8f8b2102e95effc88000d95d01000000000000003227028def74f8ea7bede3e112e4ce09d8fb823790ed599f2259019945f2690a0100000000000000c686fbbc968476537924f90aaa4993eef8314685d150228c462f8ae4e5e1e57f01000000000000004ca838afa9f12e88436eacb5024f3f94c95a66c32e114f65f3136176e426c75501000000000000000c60356c02d5d99293952c478fd07b2cff982dbad863ebdadf25c9e69206f14901000000000000003a8b589c8222ede45b3d95c8d9176543ffa9a29cbfa0ba2af60fc412e732d75e0100000000000000a43b19f13ec057124df240aad303e969f7d02fafc02c263d7ec814b6729d1b2001000000000000000884c85734b971a88cd94d86d3c62fdf163256a0387e15e2d36d8f25523a77480100000000000000f2cd13ba1efd67dfd5f8c9150b1a74d1ed1bad1a72c36fed96163b062e463d0101000000000000002001d47fbff7291a50650047b27cc47f1d22a0bdfbbfb0b8b7a6e8bbf350bf620100000000000000ecf0297bddebd3d766ea7def2bac79ad6eb650fabdcd029b99cb1649ff7dc8150100000000000000121f9d8ba85d89e3c6f9a0fedcdfc9b05cc40a6d3324eff6e8a58aec5f52590501000000000000008a16fb5a6718a714296cb8fa2ca708f677f78c7f883ba3c5ad1bbb9e23f37705010000000000000038c9a0897d9caff03a308d2120bbe892974ae8cb05f1cfe8b97259f0ac2e852901000000000000003491cc113ef8fe1165bb10e65cbb461955f92f8f0d82f2dcfe6664430dab853601000000000000004e466f6a4930d856a1f53f21c1a44451ead20c8c71319f6a685f0e254d24c32101000000000000007617b69110c43683b5000788259be855890c474be8fed65d7b1dae1d534ef85c01000000000000005e0fa84f762f7d6e4c4b0c18a86e1b7da6cb4fe7dfcf6b5c0056a7ccd8eb201401000000000000002037d70f4c244c81422409ad01d28d72a30d26e595fbcc791daeb57f78a8567001000000000000003cfa50228b841c7d2fab03db7e4bf282cf14e127ab9b31c23fca1a79be54e823010000000000000088fa8bb07ebce99964718c65d0d6f1b091ef2f4d4cdf7b94a22c42c007ecd706010000000000000052ac28ba2601723d23a086b5d775f19319f110ba5e9292f2af461e71903b5b50010000000000000002a4b2935b657f9ec563642ab0f34e223ef594cc70c856b9bd70fbe0837215600100000000000000c280e82e46ecabc4d68169e292c59cef96432f25fe849b8a147db5ca0ce7e17b010000000000000092e5bb9d0906f768dbdde0696b78e493cc78dc1f68789575b24f0b962799b51e01000000000000006ca32996225021dadb0b3f22460db6ce243faa3a0df7b33ef28e5fbcb9cf6f2f01000000000000004a512ac212da2c96d7bc8590865ce627e6b60246700595bb100b240e80a3f0760100000000000000f0c0cc64f8973ebc2322273e684b4f73f412503f124c130be0be1589718cdd780100000000000000322dcdf3a5f50091af8b876983da0e0e98e358339e6033cdb865cd64995f86130100000000000000b63f9ab3a147d76614bfb688751f79fb9a120d40af7ba3bb123c1957b91a411d010000000000000010e37a12fc6ed768d1a2d33c8abc6db675381dfe69c832abb77d9ba2341b3c4a01000000000000003213885ba6fd707b0716aeaad959cd824ab2f854e55963d9e69af006d194d51f0100000000000000fa1b0afc9ce9e9742c4825890f6d93bb87bd199e55e86ce66ba7c34ce43e273e01000000000000008013bf5a25c703e64dc4ae7e1248c0f2c7abad9e43672d82611d10974019985601000000000000007075de5f3cae26e005560440e9cc633c9fe8d7143b1fb8dc67e0d1ed7871e77d0100000000000000188d1a45dca0c370ba6b7952ba682570fd4f61501c4dea9826a981374a3f815f01000000000000004c1dbdaaf0fb061228d2245561476088bc608788cb3e9c5266f5a8e54bdd1e670100000000000000d23c53a531e356646133db73065cd83999693a5bdfc05931238434f5b031522f01000000000000006a40a8b74a142958efb2d75cd363635eccbfb70cddb24f0626d0ec927d98233801000000000000005e127fe875a9c6396693b778833a710b0426a4fc0af4af490e7ff0a6f3e8b61f0100000000000000aa74176b5870c97b754a157ec0d8032148c2ae717a905e0e5e626048b6f5334301000000000000003e07b075219fc7ace8dc3bf3a06f5dc12aa9c7e45fe30244d2284bcfb1e6ee190100000000000000a4a0bc81aaad1ebce3fdf896a8d6d081ab93efc2de9d5c56f2632edfeaa7ad0f0100000000000000465242c8915eea46e25549f2ab97cfe78784f25083e51773e07d5a0cafc2de32010000000000000022376791bf19fefac611324d27bc6acb4b7f7eec713c186adbeda5a1e1b88f340100000000000000bc8f93a45201992fa9d04355095d03adeb5ff1aea206425eae4f902ffd47fe200100000000000000288c08430a7e427400dd5b61926b74a82abcbbc91ac739190cc791a581f6836a0100000000000000eec1df2a382f2f9d0e7dbd91ebffe7be19dc9e01159cf3b82229a3ad2a33685b0100000000000000fecb15325d9baf603112dd397d2e83d3694414f529d75c4b639c7e775b979b14010000000000000028052d0b965ed862b7861aa7f3f91fe52ff8b0f795ff476c7e0a7aa42e79933001000000000000001c860d36fc84a54978d99ad400a719dbbef493f8631856e6def3e9ec998cde3e01000000000000002ef781a1d268b8afb0a8331ece83f3fff6877baa2d06ed9a23d484d5d70a5003010000000000000092cca18f264bdcfc19e5c01515ea9d61a0bf0b4e46b2bcae372a428b9dc35e390100000000000000e0b770b1bcf7deb030ee75d5bad6ec1ebfe06ded0fc406a8520a9650fe832330010000000000000066a5a598bd5d484fe66e630a3e57f3b245fe0413f81401d7a5d59aeed1a3a46301000000000000003622bfbaf9350b5906bdf9ce362e06726224ed141c5d29e8e175e0beedbd3d3d01000000000000000469db5710f30dc9ed7411417170efd62ce8bbe36ccab6df758a94aa7b7f720b010000000000000008e80cc5ada5e557a1cea3658402bc83f9892b5c4e112b6e157e6e7d3663c47b01000000000000007836067da2bc290dc3c428c548a4dbebfdeddbc10a2db206abb6ac11741dc63e01000000000000006ed90090a744a0d55adf8f8af5af4d5198bb67220ce33fe71121d7c51f27a4130100000000000000bc20aa968087f7c0d4bb35dd9c502db39fd7f4596a412880fdcd5ddba22fcf460100000000000000ea82745d9978e47fc6bb25fc01383aad42aeee65662b6af304474f0e4101b06f010000000000000072f2ff3d21f4126e217f10f9d9bd18069c12eaab6922d073dd5241ac718e91200100000000000000f25d3265659fca9d24ca877823644f1223714b0167d0a676cf3c9c447173d12f01000000000000009ab493c4c8007f49a3e7d1e9f1aef39b39cd66a496e90486e62664725c6ba06f010000000000000094cc8c46f9670417f5ad9492d17189c4e03e96122782e92824f05e176d6843790100000000000000369a7419ed7884aecd3cda7ec3576942cacde7a9b8f2fe9a1115be827e2ba83b010000000000000096ef8b525c38b9a74a3014bd99979230dab2f20221e8c7d1db50c7a61a02e97e01000000000000001827754b7465edb9bf4ce981bdd3a33057f9450fc895e39654dbd51c3ab9835a01000000000000008c45a06f479923e10cc400ae1600234f85906e26195bde9023350efaf0bc622c01000000000000006053f4e41a4db1dd6ddcd2304b62de45cda832c4e63a831ce9e634fab830d40d0100000000000000f2065428f52da2f7a881f9b94bfd38719bb6e5ff88a6800bbb3aebb1a9ad21020100000000000000104b3d784f0ae26bf3268fb7342a99fcbb1ea61068e03337df050ef2e0895374010000000000000092006149452119964a75232851f01361608dc0a52031f240e93e70e98a3ff21901000000000000009ad36892ec05281de9c63c7cefb3f31e448957a9572e650d9f3af1f21b2f515e0100000000000000bae8e68bc8f1b66fe3229ee72d77137b394c6b7dfbf55e424f9d2c82d5c99600010000000000000098f7988d5a74a0e52f58dd3d232ac3e93ff757480db9d4c12761b04fef032c460100000000000000248cddedee20dbb65f20a1715c2490c09241f6800b72d0c4029a1c234f2ce74b01000000000000008ca0a873b2685dde8c4792832cabe50ea5a1f8a9a661a336689859319b66ba6201000000000000001cf3abc7c9d8027488ea2f5f2463fd091b194fbeeebf560875e8648fbc67dc24010000000000000060b521110672f6f871978fd3ac4a835b5e30c3fa727c04c70dbc543fcad38b0e01000000000000001c103b038f0515bb77061128200e1f117a531cb4474cf5f9430535345f54196701000000000000002ab0b5cc358184be4fa29e7a3dc24806a72e55baad40ec9a117324a884242c2801000000000000005afe620da258a48f00c3afbb8a98161e977f076c7e7f8392975a4f0db4b57d6101000000000000001ae9aab4a890c558ac8ab90ccbbf193b3841083670ebed278b2161fa2ec7b3040100000000000000c2d156c96e21691a06cecd4a396978f94cfb3a1760d41180efe382b7ce8e993f01000000000000004616ac86f0d45899eed3f1246dc5744858a694a92b0abd9f10e52dfc9c2867460100000000000000a4b31af719e5d9c3b69326ef920736e8b620b329eade475ae23a33fbd445df7201000000000000009281394b5d35827c826e1d7444f346c247b9a004aa0292a9ca2b16e0fb55687701000000000000007e88cd54f47c1f4ddd9d3a198fc689d24a523fe186d526b14e476f14ced7db3c0100000000000000e6a08fa6af54d2308215f4a62d554dd5b82deaec8ba22a2e6ebade7202ab9e21010000000000000096e0b71982f3e7ba6ab06d28dfbf803caf4ac51b7633bee848f4f3fadc0dac480100000000000000068245d8a483bdbd4e9d88b49e17a651ec168f25e6851fc52c2e36a516031d5e0100000000000000386bcf52f4c464e6a18169f776d69e90880301f01fcc8cc0ba451f1d7e6c3b7c0100000000000000dc1d6d9b878558829a87267a578e1d044b2033888074dcc3a9fcd69cd5e60d3e0100000000000000b41546275611fa185c88c7016e909222b3a757b476316766a72729d074d8e92b01000000000000007e0da5500e4e91faec6b7c3763c52058a7a9350be3009f2fe00a8e3bf0c59e790100000000000000a8d082a4289fe5ccaada604e70c4b1473d6fae4374663672e61474852c1ebf2a0100000000000000309ab613bea03c4431f7602c937f5a4d17e2102db6fc7f77e32f7a245041b90c0100000000000000e0ee8ff76b364ad2ccc3e82e69cd700c0895607a449c5af3745bb3018a18432201000000000000005d9f86b7514745bf41299f7fb39969966e4b7556bc3942a51c95052f523349390100000000000000040000000000000002", + "babeFinalizedBlockWeight": 4980440, + "finalizedBlockHeader": "0x08fc7d82be90fc446540dfc7fa84ea9654e4b325c371287af36fc682b35de5003662c1045aa42cc757a09c3e25503e09011b5d42bda04ae837625b94fc8b5707fc720a1e1542f33045f3c148004d12449a85939443875ed22a6b784d0b98bcd23e8d94700c0642414245b50103c5000000be96fe1000000000b23bf90dbb77221a32ecce7d972f2329400d1f1e63ad35dceeea1da85b70db291c684e274e48e2209af241ba33af42ffb5d146744563a182f2a9e5f19eed2807cc6de44d4cd6122378107fdc2e911e1dbb48ad8e3128c2704fffd376f897770a0442454546840339ee35d495af3a52ded5bf12f7d0199ba9a2ef6b7fad55d4a43b1d3d298b149c05424142450101a67b1f75fc1754699d7be1faae0fc2607c30bfbf391a214842ad1a28bf11d257d89dba14f111563675fe3f407e0b6068ca17e42da4e34311471673b233f0b680", + "grandpaAuthoritySet": "0xa5046f706506065685b322054d22e8a1f23ca9df75c32a88dda5214ad58b553b4cca01000000000000008a239af78d4659897af698b5670533fa6d215864be8c41e3a2fc4309f9f83dcb0100000000000000e2b9e72d9202e99526fa626d9a6651dfd7c1daec8fc6ba1130af96f7d21a42da010000000000000056b838dd2005e499be47ceef086df4ca9c5fbc1f81968391c31af062a8a8bef301000000000000004a3fc0fe1020c7f460c7bd23d0b657c03368552b2f0a12d80a1c406fd066e0db01000000000000009b992b5e9b99eb2cd3b2b648d6db81ed722a2feb4938d998b58dcb5d159fadfa0100000000000000aee9de3938173700b3e3f4fbf2b200ae296173a0854157f40de2598dd4cad8f10100000000000000243f110deac5efe8e963d794eb8706a1895ae1942523ab0fe9e1623515b7dea80100000000000000e8d7333e457fa740db924866152f31c3bfa6124c0367b0878a61aff2d5d6e27e0100000000000000426b2be4596a759a15028d84e08c5c56440e6cede68d088f47c671cc3387c3e6010000000000000070ba6e5985990ba1b1392713236f1b50df750f10f744cc6eb95fa7c5cfbc68760100000000000000d343862beda4cf485b4a3b7e9b62d3b7e6263b47f65a7c88c88f6e0f1350c7a50100000000000000116768c765c7ce5a5e895a5342d1f56f1a118901d8d36fe584bab325506f3b2801000000000000007d09df0a629a0eee12da27d7fad8b18833a7d1edc7c6c8b7701e425ae449fa820100000000000000e511d441d6d3c822cb276bb2a14b1c8071d9fe1995802383fb5dcf8a92edcfc20100000000000000be2235b9d9c9164f494dd688000fb569a37d5c47912ef99b9ebda9318d13345e010000000000000049c0902ee37b569482da5474a15458b5dee16102fbc09b45878bb05f4a717acf01000000000000000e0ac68072ac35b8f19f98d13385b6eb75cf6fd4d513d9a2abfe9711b19883bb01000000000000007818639057900f8fb58e3aa8180f6108c251884a9fcb8041ca645cf612bc1eda0100000000000000a8dbfc6cb88ac105e25b9dc7f11e883631824647cd4d0c18014bb6239627b2900100000000000000a5b094ae7c156592baa68ce18dab6368d5b665e9a0f07dfc5f54f58309e086c101000000000000005ce9f5dbcde6b3a066cfe93e07f0066fa7aa3ef8511d34dede8aa8f7cba5b68b010000000000000041ef4a31eb7dc1e01f4630604e1908e644d7cdee3f66a60f98d6d59605326f8b0100000000000000890f5c296681b8c23038b3d36a491ca9e0e7e809e6455b2bcd28a13700f81abb010000000000000008cc1d6c743da905511a39a6f0a68809a6bc32f8ac25e53bb2d6aca4f493fc9b0100000000000000acd71d4269b3ba2a9de822d494c4d841708e1519c08de41d7fc6153eaf48da8101000000000000007c1024f3b93e54cb1cdde0d2f685e2e16cadabe59e407ebc45eabb07efebca6101000000000000000f42866aa6927f1c5916a8a1a5a5cba2d88e1fff957d80df701617d93ee6407801000000000000005cba2c6f569da1edc3778308da406f266aa53140381dbb3f14f22909ba6e30040100000000000000dac2e90de824b109043f70818d53eabe05e79d518bda504e951d7f4056b0b2720100000000000000652f455eb3d30486151c716a4031bc02bd00254ef3e8290fd29f946d958a46b60100000000000000589fc35b132ef9d7ed9a6787a203e5a3a37f8cd6c775f47ac5e589d55d381a640100000000000000a34b3f8e84aa86be3b47260f67720030795fc96379e5b31cc6c87c2f4d1cc3e001000000000000007977808620ade75f3efeb26b0926229e0817c6163399f1d48f39ece8159c9ec20100000000000000dccafad8bba5affbc80095564afc9376881907073a060979fabbb962bef08d560100000000000000cba3e016511b2fea3ba7738f807f31d6dc0679b877910dff84cf12bc357105d30100000000000000aa3be8112cdf851411fe9e00fe9ef0a6b58217326ba7c1ab7ed9ce8a34620b250100000000000000c1c1ff5f66fefb5c0849e3b2333411d1f7e9dd4888600e334e7a33623f15fa360100000000000000fe240e80ff8a48a77947b394979cf361017cd906ddaab637d72cf72e729d79bf01000000000000002f40f2660559a4472aa7d2b5dac22c8925b9baeaec9fa2463cef2a77eb9d3a1b0100000000000000fa2c21f1a03638d4cb35202102240c2b85f5667924d5838cc503721117049da601000000000000008aabd4f6d7ecec7a749c83fc7be33f3b4818cca6f93a4927b4964900df9454e50100000000000000fcc0d954c7d519851e0094cd9a015b4789022a37091e3a04791d0731bd85f0d301000000000000003948bfd09bbbc2fe6ac5dfe53146e32df50828eecf7b2b18cdcff8dc385cbd750100000000000000a2a4af2a11ae7ba812fcc32845583d0354a0f2ffb1271a53c9a976a0f47fff4401000000000000002385953f1ac49461b9c243159d9668b26e7322e19fff7bc18d90634f0f767ce8010000000000000058e304af91397247f704ce95d60845629aa59a50fba1c13896bb2300708db47201000000000000008663371a5899d5e7a8bc99b9a6ce24c8c3f5f1149c1e70accf9560405c1a5bf201000000000000003d28789c6d574f3aa6d14360471901c5bf8255d072c2209fa22ac773bd32e5bf010000000000000041763df8284ae8248ee0f649982ffc7d4f613e07c7bb83cd554aca5dcf8f56250100000000000000cc0c6a91c7971438b621cd9a3bd37a67f52ec4093336585d1e2c73416195e28a010000000000000094040fd277c75d7227bf8d55973060bde3809b3b7d6ec79602f19cdf68e775cc0100000000000000de52bfa88c4a76bb22fbebb0f078dfcc5a327034e0044e8f8034f2a96e7adfef0100000000000000bf3fd3d4065b306638662c3e789d830a63d9b343cef5f863d346058387844b58010000000000000005197187ac7eb8d0a3cfadd32f1a7fb662e7e4a16ea718af3f1e4437b865205b0100000000000000c84074bb67af84cdf84b9df1dadc1188cd75709a8d11bba65f2835d76f38c4730100000000000000aaecb94cc62ac90656976daa8955353e0ff22fcabd55715903be2f958988bc070100000000000000b98c920666586f392d129d480e78a965764ac82de45e691589b3aab7831a7f020100000000000000cb92ffeace78dbafe6fbf275741b4b38657fb81590712aa0bca7877931f6ad39010000000000000034a18d21097f479eecbe51b91c522a798582caafc787134bab6888854742406e010000000000000027791275ae7d4735aa45e70210663067f7d268aa57126a26044c8f6d8572a7d80100000000000000f7c9f4bc8669969246cfb748ac6996db6cd4c1fc634d981a1093b2c3d7a2eadf0100000000000000b0b60d160bed8c1484f5359eb5282e523c47daaf880cb2d32edf97f633aeffd10100000000000000106ea6714f4bd7ecc914d6b6696f031f4d04a74afc55051068d3c44edfc6ecbc0100000000000000f001e2e99b378fa4f2d1a50b28c3fcefcd7da3a66314af1280fb7f9cb429dd380100000000000000ffd82ddc49373448bed6feb0032744e20068f4e21adc4cb6d2cbf05ce73f4ce40100000000000000507b0289bfb2f55c7a62ec3c3298690909013c916dd5885b05b330fdc0caf1270100000000000000c8185ca8ae6330a1e03490e132163adf517f76402ecac6881a51c8a14ed62f940100000000000000c49e3cd2c701bb845963c2870dcca12ed070c3f67ffc20144327a93aa6e896ec010000000000000081b1fce3ee9e31723f1023eaa9f8793e8663e72c50fbb0fbcea9bc78bacc491b01000000000000002dad5b2212ee688f2eeb9ca1fb6a90574f006dc1c6680ac3a8523363a248940b01000000000000004bb953c285fc6de7ef27baf835e8d905e60d86fb1bca0e52af8323e9d1ff219d010000000000000050f9fd6c0623020debb7843bcb832ee1d80db9b156d8e6083ccebd434fe979470100000000000000b8183b905f28b87c68c2d5b2f39f009f2ee22b47235f6c6d6cf6e63121b490300100000000000000b7c13f1239888cda5c8e6ac9ea10675df17633368906e66a487f91ddd3268ca601000000000000002cd51e09c3197e04155b78f3d97742ceffface390dc46f81f2613a94b2e483fd0100000000000000affb713ecdae328aa4436756f6a3e8add6b274d5ef1cc19d7aa69ab82c80e472010000000000000086cddc46c9a3a42c3821183d597e76872f1d4904b84a92e8160ab4e0fb4d39a8010000000000000052912b3dfd0ccacd00586b97f1abe32431a2f6fa9c2b3bb17837a1ecde61728001000000000000008a2b50acd1a4955fc814bf6720c7427902a6ce709f3a2d7c17c55b67f6f1c0630100000000000000ff80f99fcf0f4072402a4e522aecd41ff231c5b579d978d0383dda0407ee498b0100000000000000fd856413411b2e50cf1d32f8253c9bf7b055df259c42fc3a501ced6850173f8f01000000000000006565187c86eca2aaf37db6d59405535a5e6dd85e2743a07ebf50e55c2b7fbc890100000000000000aa674be249403288a8078e209231e764e3679f2f66a1070ea5d9b5b420fc53ab0100000000000000d1c146d2429a5a827660008721c7a880e71f44feaa3dc75524c1a9281bac48cd01000000000000005d2b07941a21adb6ba52298c2f0b0bdb6023e4a1713018762a5f61973b2fd1e80100000000000000e4b2cffd0b9cacfc500050b27ecae3c55b9b51bd9a416d62605118c8ad4fb09f0100000000000000f42c2e2a4157d51d22d5997dea1342f65e1882e207fd0e64e8e5d44330857eef0100000000000000f6d74de7b39455519a5d6480c8f12c93fc7a4cfc9af39154fc60857a39ad888b0100000000000000c8be78d05f652edd0a64a5865455de36d0fadb0d91c470fd344f8de23c8a6b9c01000000000000006ad5224d5c8f7fb3ae15dcb3766c0956ca627a6c91e93c4e770a2908e8f590150100000000000000f5fef7a87c9f3917fd28640907ce59ad26f33e41baa25d8ead8033ae0b944d7901000000000000005d0124063ede3e49f037df33948477235e5a58f93f8b98bf7203f25e11d4f0b4010000000000000049bfee2608fe8c9d280c80fe2e7e50d15980deeb1d29a2edc7507d17b319e7760100000000000000be95095d93298171c6fb8a1847adfa173d127e13f53482dcb694f891d68f0c58010000000000000085b714accac0654ba57fac59b626dd35802269d2c1d995cea7c335cb05a88f7f0100000000000000098e7f6085499cc37621458acc5a44dd928202482d456fed047f76a7edf1c08a01000000000000009c11e35911f023df6e4d218e53412ab4e4a20c17961d63ba381c913b51f394c001000000000000007448b6f6db7cfffd8650a1f3f08ddad1e114321ea770c9cfe6154882f586edb50100000000000000eea0e8d1a0aae5e5cd38dda0e172b49f8ea02287fd7d2ca79ffcdf6e593a2831010000000000000037483029302a84623f0a8db165fbed905b0a4fc25e7cfb56e975a0e98336a59b010000000000000053b5918f72e73f92f32b578d1b602f0cc554d98bee8c4e131ef0ac7a63399fb40100000000000000178838772f4eb26785673a57c8365e98a21ede2ed8d1ca3aeccbf7ef2631da110100000000000000587473ac474bbd8c99d14bec88d614426944b5c84dbf2912abac7610741560ff01000000000000001935d43843c66ecf76a9f4c4229de9ed7c172f52aa53d1a279f2856a736661b80100000000000000e1d3d955e446b13a28abadadd28971475035b3f25fcd414111bde54b53a3faab0100000000000000501c3978722a089f663f75c7865626a43d13ce19bd924583e43a46720584ed140100000000000000cdeaed45451971dcdcf886df977f31b3c004c497037d9940bcbbf2bd6dd2e3340100000000000000cc5dc1c5155dfcf43ee8dc4443292e966cb3226aea4fdf88e73daa259d66b673010000000000000008cb5d0ff7f138698c9fb80a1383155cff65ec7e127c5b3614e2e17963969f100100000000000000a7ae34bd517afa9f7563b73483435a14c56d9901a78f9459566355ec60a7cc8501000000000000006727561447ed474ff4e15645b952a37fa5008d4e694d4853bb55594fa34c4f340100000000000000c05f72a55f91f613b2da541ae27eb6053e80f267c906c135a4ebd848ecfb49db0100000000000000ec295fb809e22c332aa36a57afe05f2c093b2d13e52b0971d8265c5514e4e9690100000000000000a47880b0265ec6d2348a47b2df5b8cffd9c3221c1c9ed0e623d68641f4172c060100000000000000efb5f1e4c4ba37f8c159d452d897c607a58518b8355a8454620b3e3ccc3271230100000000000000099a9eb71f9cb1b7d15eae384790b4ec35045a19acea1730ba62f3e7caf31e8b0100000000000000d34560b879f8f4dd8d2fbd4f6d51b9b6f41b76656860646fcef4e1498859a190010000000000000061914b4dba0a1e42e692016cb74943266b257339008ffed4644231a2b48df21a0100000000000000a703a37bd5d93619bfb6ad72c24840b396b2ddb8700db2e1d372a82363ec7d580100000000000000a892342c56149812a43e98c82b6a3dfee7eff384d9b6d832002ea63838f64900010000000000000081bbaa3313b09e3b0ea2817c3e968a33587ec8928539c3f3a6d0e65644612f4901000000000000003d884e3f58913c10c26d8af2a095e231079a3a0b69f775052f7173ff1c3ace2e0100000000000000c13b603b5fe774d98e59c26fac03f8096ccc42c57d0cbc6a443b4f07a3c077920100000000000000be6b59cb464fadec4e0b22a9f12857ba5cf7a14c4f9551439d36305d582dd7fb0100000000000000f916634f9fd7e54374e30ac6b722ad1793c13cb2d5f2ad38769eaca2f79d414b01000000000000007ba967a2dae0d8839cf44710591db994d18e53b25ec6d0f861da0037c4a4366a0100000000000000222ee6c6a6c62d56cadb4eaad5104d595fe962fbbdd551c81562d3b509212907010000000000000055ca63358082034ddaf76b75f41a396081dd4f39a61eff13f7575e506e1033560100000000000000faa7af0f76a660a8c8c89fabf7290f2938798fcf0d522902d5d8b1d3a177e05d01000000000000000aadf1b2009026f8f5dd75d532e91dc756fd47572aa0f3c15d26790e6d6b2f27010000000000000050e16d897010823670148ef157d77933bc1721d82c45e80eb73b46b12b5daab601000000000000000228d7fc42b304906518cbd91d73a5384c4893de6cbfe1e7346999df642d3d0001000000000000004f950be5bf61958a0ae6e6a036b85b33ba838de8bd5508b558cbe2602d341168010000000000000082e6b6bf1f275c59fbde0dad91393ae690d5e644d11d23898a9ccfdda025920a010000000000000074b60dfb12745236ba9dc8f925efa21482b50c870c567638ba3240a05fe363d90100000000000000d761043f405069ac01285f1ff258450aac675f08d906b1ae0a1ce54eabcb36d901000000000000000dfbc1b5757e1f0ba348f8af64fb631aaff86cd21fa0529e0bb1fbab2508792601000000000000004abc35969775726127370e3bef6da0c45c5e281ed03b11bc32eb5d736d197e380100000000000000d791b58285e2c4f17c82a518e099812d2a3f63e1090f1cb2576e2c7695ee24970100000000000000de74612da9080d47be35bf4ded2094e23c1de14477114ddcd7b76b815456ec0c0100000000000000d3b3d9703a265a51a137b9de348587c645a168981ef3e01c9dc482856751b8ef010000000000000003dd543dddd6ad00137ddf94a218bfa19d2f08b4365d696765dc25deef76598b0100000000000000cfb9f7f1fcf903a51af729ed1647aee928630e148990309f9dc9f3b14b114b7601000000000000005216ff912251cd2bcf9db256b3927e737cf909e4b53a375586dad21bb7b907ef0100000000000000d14a779884de1b2fbf079b8e47e8c0edb1c29e282996899a4eab5aaf1f4f41130100000000000000b5b64e522ece2a1a3325f95082e33bbf5832e6116d378ac0f437b7b49727292401000000000000004bf6037c3820cb7468601051701164948b7f7cbbe1ac8cad97e809c76170dddf010000000000000061f8830d235dc8b50288a606b3570c8335eefac47874c26a45f170cd29a5dd3301000000000000001ec0811cbe4f2ea1e5a714d3ba08c6d7fdec138bcc6406da3c6cd32f1686616d010000000000000025ebbb2a00126545bbedf00318a78b6e61a0b52c81e30231ff45bd32e311472f01000000000000008b7baa89dbac95969a0042fa876a37eaccfcecd3591c4d7ed0e8051aea814cfa01000000000000004715211e268489d1eeccfbd8a5e67235244322c17127226184448741ae332ba10100000000000000dc5289899ba3e91edf93781843f9abbc99b3ae0beb940c385edf706acdf0d2540100000000000000ddac76c2a61c9aef4a9b3247aa0953187533f346466f02840235662440d2945c0100000000000000055c25dcc9cf8a08ad007ed9c8afb0ba53cebd129a20f194d272535ca9fa06490100000000000000cc8db7467349129a20ab4ba7e705044216651c0eba9d39f1054849edbcd677af01000000000000004df6e4d7da2c11ddb9153c714699f9ab625bbcd5e8e38f1cdeee567dc04abc610100000000000000982d9e3cc8ef3f8d99638b6f9df32c82356e1cd88f123d1e586a604d1d4b0cb401000000000000009cfeed14dd2f96550a0e7edebd9c9a8c8b1d8f7efdd1abca01987654239f3c860100000000000000736925c31654df870fbc29437c9b2a488ac3262e5d80798534ad00c43a61e5470100000000000000e08ce24248f3f8c0cdd313a5d46e6d491fccf6711788b6aca2de82f6700ced5101000000000000008404cabeb0674765bb77af690fa838ba28fa2045d602994a89f07680f4851c83010000000000000006b9e740c0a0e1f8fd31717438d5918ed8680eaccb70fdc9511931ce0d164ae50100000000000000b8cf76a8082d518016ea5588be57b64e156ed23b0f72248975522c23d15ef16101000000000000002565e04c6e0b665fac87f8238bee74837f8f621ed63409f3838d263603400a980100000000000000373b26b330a41547971874dd81c2cbbf8b7e3eda05b861c57205ad7e8c15bbcf0100000000000000362589a96b0adb6b0d48e51e0870986ff75719ac8f348fc7b906dabf616531090100000000000000620c78305072857b43dadced80ebc057dbfc82b58c14c7b63372ef021408676501000000000000001de97cc443740a0e0e0fdf166ef4515c387fec450fc4d4e141cebb41e1b7f8e90100000000000000546ce2099b3863d2d75324d5866bfd5324d8ee4701a99dd53528f8a8c898ca4801000000000000004dc2e72680dbf0156818114fa34d3591f8e6948df25a128e191190c66f6ac35301000000000000001ebe41ca4cd399901ffe5f6f52642630820500e4a96cbef4c80c560cae38d2c601000000000000005d50d6099c7c88f367568fa473b44785acccd030251627cb371de16e5fa704260100000000000000301b983e5e1320b7c9ff0f2525121b9f3007f68c273ba8ff662b7244f1f95f210100000000000000ef5b937d1eb14d07785430ca8efb57cb965060fac808b9a25ab9d4ab52cf0ad10100000000000000b1f748c87b12edf7242b4719cfe68e6761acaa4329beee538d6ff740941d3cd3010000000000000014a3f3f45d0bc1352f8665d1e24cb13d72d95b48c595913cc985dcf58e63c123010000000000000072341ca1eb3a0fd4e790318b51ace114315573d5355c9d5336e39382ba0642560100000000000000a79cd2241bd68004641baac25c1900da3a9e6d83101aea3ef2a58d78c657272f010000000000000028139ae721b771cf57d5afa58579d8dc0f04f04c1e1b631cac64a9fdfaf8b5250100000000000000b66e24ea84d5e02a7b2b58e20bbf17a0f2a19c4654bf8b07669ba3b9fc4a468101000000000000003c1dcee818434058b7de26ee874ade21bd1149185d6dcba1f67048b931ec3dda01000000000000000d8e0ceb31d11634ff50f20c90d57239a9307602e221baa190c784b144a7eb980100000000000000d1f73fb97dc0b0c3244c8d879f134dc90f614eb30505e8f27eff58e558d221f5010000000000000015b49bdd8cb8b9110a45bd1985746655b330829e1dbe7580ade2fab6531799d301000000000000000428e3ccdba17d779ffba05c9ec7a6264187d13bf89b6009e97200474ad3439701000000000000004c43a374e6b3e6f7d6c5a6b8518ae0d0d232a1c46d63af8fbc800045a14cbe930100000000000000c34f62968a87b2e4a9340a75004029dff5777a020f60fb287f08038491881f220100000000000000f54bb82d58c665ce3289b8765c40e60d84f74da663c164c38e16784d5c142b2c0100000000000000607737116e62ba11852c68515933afb8165f3174d594eef6d01dd7eaddb60ec30100000000000000dea32ed7afbb5b31cb45b6e5daff40fb33e80042994d8d6527ee262e32fb2131010000000000000065dc4c53802befd2acfc3d6d3f66eeb84947e5c15fc7a2165a375352a4faace101000000000000007c39d28f80a16bf0cedb70e36c5ac9063dd9b513c5fbbe2c2222389f428921340100000000000000bdee8597e248688fddc627ad9c95cbebf7d3b5f248b9a742aa2d8e761fa365050100000000000000a128a73c5eaa1803618a75bc368c38e4c5cd40999cb72d615b8af1d30cb8cf1d010000000000000020270811c3dc453f37b27d958ef7ad7dd4c7f217c83f94bd0ecd84c60018a86601000000000000006bed5c36442ab221e4d825e3ef41e30bddd8bb3847153706d69d851e186092c1010000000000000020869a63e7a343094ad0b4ffaa3d83344ffec8c7fb9b177008f78d17eda7dcbf0100000000000000f549e094ce2c081069b7a39b67a13a00899882b79ed9ce8c63b2599cbb0900950100000000000000d64083c00178b8dd224afade9792fed8076031bdfe9efc5b8128e6372a9261e201000000000000001c6842f07fb07b318a8d00ce6258844374f8e894853ae5fd4a85c867d3fc32e30100000000000000417e120dbfd0297d59458b48407b62570987f1e907dd6dfa9a20bfe64eb489d80100000000000000443bd12fcb944a0e19b2f76ddd066a713a99d2dd3530a5f39275300d11ac96590100000000000000be724139e9bdd099b70f7edab7d1acf0d05fa1a4ca212f5e2958d31f4272dcda0100000000000000134cf4720486824c6a27fa7892c8d82e805653ba1d98480267ec284a76b792c20100000000000000f701f07489e11959ace47ce003808f4248a6c64b35f51f0551f4a69aa0572e2f0100000000000000c2eb94269c5e5d2ab9a1a300387358679640763b053aca99ba5c1c9083ee717f0100000000000000316bafdefb60951da2738d6c9c2ef1866d139b34b5eab6944d6bae754dd3fb110100000000000000b65475766e6229c87ff34263f5ca58525ab133962bc599ca0eab096ff296f4e60100000000000000ebb1834a568ea7653bc66f394937a0aa4f2f617118d2161e2c11c0d7d2febb9d0100000000000000b6d7ac98d6667fe8f4a186ef12a66b017df05a54e11b45d3f2967cb3d6b6827f010000000000000042f47dad5949be7b7b8f81faaec17b1b53465b01b9f8f81e6a45f2fc74e12daf01000000000000007a1291795805dbe300425311ae50ed698450b1912b62e5b5a3264c68bfa970760100000000000000826fea075408d2c9331974dad61f4fedb0a7a306711c696997bc63b4b0e73e4c0100000000000000e0df5b2f299314d2d419b46d15c3c8a739182d91c3d4b98cd16c013c3a25c04b01000000000000000150276c1b3d28d42630801c1d4a738ae723887d9286e40ba48d10b0752f7dcc010000000000000098a6defcfeb3dfca36ec46eb373734627a2c395cdd2d886046a11788ed6467af0100000000000000853ba986f8785e8fc1a2ae2fb86f17cc91886d931182ccb8d148379a35cbf02701000000000000009bbc024bfe4f072b94735afda064dc3c7da2b4bc0c50cfad44722543583a372e010000000000000086dee2a2c1977cb6ff99dde8fc5b0cb10dcac44b50b19b80f8252899b091c84b0100000000000000496826b538d97906e14d417b48598d7d591a483ab5f4c6786cd0b96239c2f4cf0100000000000000c4b54db8b5dc6346d0367c6c69a191cc826a90643d93c6230763a9e92806a33f0100000000000000c7009be830fe78c42f12f0753923131d16300bac230650001636b6a546cf0aa3010000000000000045f84b0909eb669ce3d2099a935e269d6ebb091f1f8055fbfcf07d6efe7f43ab0100000000000000425d9edc1cc5cf795f0caee680a379215cb77d71c69bfe41296df63cb2ac34430100000000000000ed3f97f83ee7799c4aeba9f40bd18134c862c1a30875fc1e038cd27bae3a739a0100000000000000348e8bacc2d40191a6a00e137c745a422ff8fb03148d2ff9cad75efbb7a67014010000000000000066b964258b3239799608ad4ffde6214a7b04ab3e0fd889fc7eb078548b3518ec0100000000000000efb31c5039e45fda750af5d2ea31b3210a407b168adec8f98db1f3dbc4cd94380100000000000000525661070154e9eebb48a7befd2c03e125b218eadb27cb121786678c0f67e5d901000000000000003b88c653be781a322afaacf2a4774b4fe4d72c9837c7d3ac1ec848679c6a48f90100000000000000d227434a77cd7b7127c039eb9995aeb025a242c36ca7116372c7c8fe5bc921b50100000000000000510a0c61dca3e1044d3540c08272054462c6353aac4dc06cda265753b126b38501000000000000005db4206baa8706a1b1de0ac7edacbd2a2c93452481808b8fe6c582265b57a60d0100000000000000761ce3eef4bd0d15601aef70728f54ca72a9859e90841c3d02d5060201671878010000000000000000132d9e682cf8d45ce8efd4bef165a26da5d1349ea1fe9f51abd6dc7622720201000000000000001262625cc59c0e4b7548904c31a02231a601305881a231d4dea45eec6cbbbdcc0100000000000000c3576342cbf99792896ee5329b04ff2eee2fc2bb6d53c5c03d52c8957ee793fb01000000000000006ad4bc289673029ab44f3045eb6fdd3589d05e0e5fd76ee017f650a662f898fb0100000000000000a82f563264d1892dd46873205d03c098d8b03f53e21c797839737e4e5f66a87e010000000000000059dadf17dc0f84c1c334e6a815a04bdfcd0988a3f3bcb713c66ae29e17276cc60100000000000000297dc7cf28b3d40a42c5e8faac876bf7227c670e6e031dd0e0537f4fb70e6fbe010000000000000043601ae31cf5b03cb49395dda13809f7398d8670ee4d2172b14a1ab05986ac3b0100000000000000e7f57bd0bc756f24574e3a77c90616adb393e9d4ffceb2c63df19f605cb6a0240100000000000000a5f788e86ee2d311357b7aa4a128f063fa4ee36958baf10304c10bde7421aa2c0100000000000000290321d793b7dcb12ad148c2438bb60821bd938b7e9164a0c3d0fc82987f8b6301000000000000002ef11bc5ce1e7b53f788ba01ba581b9171ef36449719ff3eb20973342a4a82850100000000000000ab45f730dd495f657b61b2777091fa8cd11b5a626bea2b514e5e61180210379701000000000000003bb30832d06cdd3e081afef0cf2b7770bfe81dc58081d1886443e4e4547da8a101000000000000002832b59000d2027d2bf57fdb40da04bd8aac1498923397517181cc487a92815201000000000000000cd7067f96a2d63fa72065302432f48690485fa5f47c9afab17123e0482785230100000000000000f6f23ae9bb4c269a5959d51f9173270ddefcc354b63de77b672bce58cabe60c801000000000000007a1df073f4a474faa4616f9a6f5d93cedf25716cbe8d05a08afafb570b6e6f9501000000000000002ada479e1fde7211de15900ed29035f6f07506cdbadc4c232aab96d62006b9de0100000000000000be223d49fdccd102646c9b0d62130fbc8e7f0324d55a3eabaaffb5ed1616795a010000000000000062a91ffda8611ffce3edeb628ea6d3b8b12e5b2448beda6da8334e77a9ecbdd7010000000000000071893ca83ebe6ee06c3eb10dcbfaf70d8267959f6159b4ca36929a69604cadbc0100000000000000dea69c3badff9b8d7571cb6c538cd099544da7460a19e1b8651c5c530a6dd53c01000000000000004ad600cc461daf6d287d5d2ff0791f74fd7c6aab5714ad50340187a7ce509ea9010000000000000005062bede97a45c6e1c6b593675ee07ce969fae45136cc2b2afc6e705a77f4700100000000000000dc6e03f650e4304ca8d1598dde8d4faf45891987bfc49ef785ace47c4c0b5573010000000000000026cdfb88461d7125f438c599e062799219b385bacca93f3cdbe5418c9d4d499301000000000000000f19c3ed807ad5f2b7546f5e6c5e9bb934835d54ed1f4f989540b86a2ca02b550100000000000000e4c1d1377894eee032e1a60dbac6252e23f35bbb43ce51d5f98652cfee58d5bf01000000000000000e7bc96895730726225e47e31c742fd44d3936f31ecd32658c694fc11df2522401000000000000000bf0e21672e2d888dfb361e7dac6bcfaeecd1de5192b6db710fd362d7378e431010000000000000081b197220d996795477a7f5929b629a3a669e43a59033ef1538a5b669e6238b30100000000000000b426ef68c50245a003dd068c5c086fc9012c08a7f9ec53fbf7df4318261c8c2c01000000000000004383e891024a29ed0fe106e7869c7e05ef8487ef13a6ac390076bf43456c6d450100000000000000e7931a825260ba7d4fdb5f4990d39a71e2a8b215a776ebf770102ca772f103a3010000000000000095fde7b91441fae9d2a6360d30228392519293be5e78cf3305667595cb15e566010000000000000096847258e5fdd261a8df1b3958366b29d28363aeb96a71c2b705e4c8864b97e10100000000000000e7eb7de26e0e24fd528fbbcecf837f26579784dfd4db512c9237e2811139738701000000000000009f677785cfbf44140bdf38770f3d8076f222aa1c9997842d89d580b0f256198f01000000000000009a0ea02dca493accceb975732f31c9d249d4c90ff1ca0bd86cbe00f1728146b401000000000000003adbd2d5abdb70ef56c2d8bd4a7c0d67882a1c2050a856937491e98496a496fe0100000000000000716a181407939b3ea68289e09265d3b9d8a8f21ba7d9f50d8ef8a86fa3c0fd0301000000000000004d960a5b5cfc68f32236a14f5e094ec24c9bd0f73df19086c27cff9a78fd5dbb01000000000000008e3d1c8c0261e193e87403c8959919ef035ba39175d3ba22f31190303601412e010000000000000094416582fe359e0a310da59bf93df8ff9665b89071d4977a9a9f3390b75c0c450100000000000000ac5230e4338aa51c44ab6a0fb903e6fd914fd029dab8f7ca447be54ceba749340100000000000000a76b32c8c28cce206ddf70ff3ad591ed01a0067f9f9baa77f9052ce938d359c701000000000000003a4bfd825ccd308def4a61bac80c579db42b02ea5f1a0768656a326e83a0dd8801000000000000007fab4769c41af85b9de8e784d3b1cda093fc0a8dffcdff21e914c62f131c77580100000000000000d2f1b3b5f7eb1b0d8328911d9ec920327d7a30729e80c1238f86dfe27c4fa3470100000000000000841584e602ab975c936fe7c2025fcea2b5a0061e839b1ad96528942b33d0974b0100000000000000e056900cabddb471de9e1846d7efdddd8b5ad400b02fc54b4402ba725c78bf9a010000000000000085b6321d0044ba1f9ed6baf255065c5d9947cd2fd6067f66dfddc74511fe583b0100000000000000daffd43670286cbddbf38953e6e33ba093f8c719e9fbf0a4aa76ff3ee97df307010000000000000098763eb72b3f7dbb7a793bd1d4367af5f072ff45a1a6eae0e002e1eaa24c5d550100000000000000d39f98bb0dd1dcda91cbe0104afc0ae7456cd77c8bb6630e2bb4c86db1cbb5b0010000000000000079f73931b31ce353119fb4063412e844b16cb3eb92e592ebd822a8c21303554801000000000000006d698963e0fa3c04ef2b32f638e0176e053cd021f6a49b55a4a4ebd4d5fbb11701000000000000002929dacc53614cea1848e7ba20fdeed7cb0bd81571aa72dfb63dfc84d3965d2b010000000000000031a46e639e57d1a11119b17f76617a35b3606d206fb5c3e87710f464f7a57de50100000000000000ed25d7114e2aef2f0e57dc2be1401a4994d8aaafb30223162634a512604a23660100000000000000600700000000000000018d58300100811d00000000000000002904050001000000000000002a0d050002000000000000002f16050003000000000000008e1f05000400000000000000ee28050005000000000000004d32050006000000000000009d3b05000700000000000000fd44050008000000000000005c4e05000900000000000000b75705000a00000000000000176105000b00000000000000766a05000c00000000000000d67305000d00000000000000357d05000e00000000000000958605000f00000000000000f58f0500100000000000000055990500110000000000000095a205001200000000000000d8ab050013000000000000000db50500140000000000000024da05001500000000000000aaec05001600000000000000f4f5050017000000000000003bff050018000000000000008b0806001900000000000000992406001a00000000000000f92d06001b000000000000000d4a06001c00000000000000685306001d00000000000000b65c06001e00000000000000f76506001f00000000000000308b060020000000000000007b940600210000000000000025a70600220000000000000033c3060023000000000000007fcc06002400000000000000c3d50600250000000000000011df060026000000000000005ae806002700000000000000a0f106002800000000000000410407002900000000000000880d07002a000000000000001b3c07002b00000000000000764507002c00000000000000357407002d00000000000000239907002e000000000000006fa207002f00000000000000c3ab070030000000000000006abe07003100000000000000bdc7070032000000000000000fd107003300000000000000b2e3070034000000000000000aed07003500000000000000971b080036000000000000009d24080037000000000000009c4008003800000000000000255308003900000000000000735c08003a000000000000000c6f08003b00000000000000048b08003c00000000000000589408003d00000000000000d3c208003e00000000000000e4de08003f000000000000003fe808004000000000000000f7fa08004100000000000000aa0d09004200000000000000153309004300000000000000fc6a090044000000000000003e74090045000000000000009a7d0900460000000000000000a30900470000000000000014db0900480000000000000020130a004900000000000000791c0a004a00000000000000364b0a004b0000000000000043830a004c00000000000000e5950a004d0000000000000045bb0a004e0000000000000059f30a004f000000000000000e060b005000000000000000812b0b005100000000000000dc340b005200000000000000ef500b005300000000000000a3630b005400000000000000b69b0b005500000000000000c7d30b005600000000000000dd0b0c005700000000000000f3430c005800000000000000087c0c00590000000000000052b30c005a0000000000000060eb0c005b00000000000000baf40c005c0000000000000072230d005d00000000000000805b0d005e000000000000007e930d005f000000000000007ccb0d00600000000000000076030e006100000000000000793b0e00620000000000000088730e00630000000000000092ab0e00640000000000000083e30e006500000000000000731b0f00660000000000000079530f006700000000000000748b0f0068000000000000001fc30f006900000000000000d0fa0f006a00000000000000633210006b00000000000000826a10006c0000000000000028a210006d0000000000000005b310006e0000000000000055d810006f000000000000004810110070000000000000006548110071000000000000008e8011007200000000000000bfb811007300000000000000bbf011007400000000000000e828120075000000000000001561120076000000000000003b991200770000000000000058d112007800000000000000770913007900000000000000944113007a00000000000000c07913007b00000000000000e7b113007c000000000000000cea13007d0000000000000067f313007e00000000000000d31814007f000000000000002e22140080000000000000008c2b14008100000000000000545a14008200000000000000ad63140083000000000000000e89140084000000000000006892140085000000000000008dca14008600000000000000b00215008700000000000000d03a15008800000000000000f3721500890000000000000015ab15008a000000000000003be315008b000000000000005d1b16008c00000000000000855316008d00000000000000b18b16008e00000000000000d3c316008f00000000000000e9fb16009000000000000000073417009100000000000000bf4617009200000000000000286c1700930000000000000029a41700940000000000000041dc17009500000000000000591418009600000000000000bf3918009700000000000000704c18009800000000000000948418009900000000000000f28d18009a00000000000000bcbc18009b00000000000000e4f418009c000000000000000b2d19009d000000000000002c6519009e00000000000000896e19009f00000000000000519d1900a00000000000000075d51900a100000000000000920d1a00a200000000000000ec161a00a300000000000000b6451a00a400000000000000887d1a00a50000000000000077b51a00a600000000000000cdbe1a00a70000000000000070ed1a00a80000000000000083091b00a9000000000000004e251b00aa00000000000000fe371b00ab00000000000000065d1b00ac000000000000005f661b00ad00000000000000bd6f1b00ae00000000000000de941b00af00000000000000fecc1b00b0000000000000001f041c00b1000000000000000c321c00b2000000000000002f3b1c00b3000000000000002e721c00b4000000000000000ca01c00b50000000000000044a91c00b60000000000000022e11c00b70000000000000044191d00b8000000000000000c481d00b9000000000000006b511d00ba000000000000008b891d00bb00000000000000a5c11d00bc0000000000000053f91d00bd00000000000000ff301e00be00000000000000054d1e00bf0000000000000002691e00c000000000000000d1a01e00c100000000000000c5d81e00c200000000000000cf101f00c30000000000000083481f00c400000000000000af801f00c500000000000000d0b81f00c600000000000000f0f01f00c7000000000000001b292000c80000000000000039612000c90000000000000054992000ca000000000000004fd12000cb000000000000004c092100cc00000000000000031c2100cd000000000000006d412100ce00000000000000cc4a2100cf0000000000000098792100d000000000000000c4b12100d100000000000000eee92100d20000000000000011222200d300000000000000325a2200d40000000000000055922200d50000000000000075ca2200d6000000000000008f022300d700000000000000b13a2300d800000000000000cd722300d90000000000000078852300da00000000000000ce8e2300db00000000000000bdaa2300dc00000000000000abe22300dd0000000000000012112400de00000000000000501a2400df0000000000000045512400e000000000000000a1882400e1000000000000005fc02400e20000000000000013f82400e30000000000000007302500e40000000000000013682500e500000000000000c37a2500e600000000000000a8962500e700000000000000fb9f2500e80000000000000000d82500e90000000000000019102600ea000000000000002b482600eb0000000000000028802600ec000000000000002eb82600ed0000000000000044d42600ee0000000000000058f02600ef00000000000000b3f92600f00000000000000065282700f10000000000000057602700f20000000000000064982700f3000000000000008dd02700f400000000000000a7ec2700f500000000000000b9082800f600000000000000e0402800f700000000000000f6782800f80000000000000019b12800f90000000000000040e92800fa000000000000006c212900fb00000000000000a0592900fc00000000000000107f2900fd00000000000000bc912900fe00000000000000eac92900ff00000000000000fd012a000001000000000000ff1d2a0001010000000000000c3a2a0002010000000000002b722a00030100000000000005aa2a000401000000000000fce12a0005010000000000004ceb2a000601000000000000e0fd2a000701000000000000c3192b000801000000000000be512b0009010000000000000a772b000a01000000000000ae892b000b01000000000000b0a52b000c01000000000000abc12b000d010000000000009bf92b000e0100000000000093312c000f0100000000000087692c00100100000000000075a12c00110100000000000074d92c00120100000000000089112d00130100000000000099492d001401000000000000b0812d001501000000000000c3b92d001601000000000000d1f12d001701000000000000d6292e001801000000000000e9612e001901000000000000ea992e001a01000000000000efd12e001b01000000000000f8092f001c01000000000000f0412f001d01000000000000e9792f001e0100000000000036832f001f01000000000000b2b12f002001000000000000a9cd2f00210100000000000094e92f0022010000000000007121300023010000000000003b5930002401000000000000089130002501000000000000599a30002601000000000000f6c830002701000000000000e30031002801000000000000c03831002901000000000000a17031002a01000000000000f27931002b010000000000007fa831002c010000000000005de031002d01000000000000aae931002e01000000000000441832002f01000000000000295032003001000000000000fe8732003101000000000000aa9a3200320100000000000010c0320033010000000000003af8320034010000000000005f303300350100000000000059683300360100000000000078a0330037010000000000009bd833003801000000000000cb1034003901000000000000f44834003a010000000000001c8134003b0100000000000044b934003c0100000000000055f134003d010000000000009dfa34003e01000000000000302935003f01000000000000c6573500400100000000000023613500410100000000000053993500420100000000000080d135004301000000000000560036004401000000000000b10936004501000000000000ce4136004601000000000000037a3600470100000000000031b2360048010000000000005fea360049010000000000007b2237004a01000000000000995a37004b01000000000000f56337004c01000000000000c69237004d01000000000000feca37004e01000000000000340338004f01000000000000683b380050010000000000009e7338005101000000000000c9ab38005201000000000000dcc7380053010000000000003cd138005401000000000000f8e338005501000000000000b0f6380056010000000000001c1c390057010000000000007a2539005801000000000000da2e39005901000000000000525439005a01000000000000878c39005b01000000000000bbc439005c01000000000000f3fc39005d0100000000000028353a005e010000000000005f6d3a005f0100000000000098a53a006001000000000000cedd3a0061010000000000000c163b006201000000000000404e3b00630100000000000019853b006401000000000000608e3b006501000000000000b8973b0066010000000000000fa13b006701000000000000a7b33b006801000000000000fabc3b00690100000000000049c63b006a010000000000009ccf3b006b01000000000000eed83b006c01000000000000c1f43b006d0100000000000014fe3b006e0100000000000066073c006f01000000000000b7103c0070010000000000009e2c3c007101000000000000ee353c00720100000000000094483c007301000000000000e0513c0074010000000000007c643c0075010000000000001d773c0076010000000000004b9c3c00770100000000000010d43c007801000000000000d80b3d0079010000000000001a153d007a0100000000000053433d007b01000000000000ea553d007c01000000000000225f3d007d0100000000000072683d007e01000000000000b4713d007f01000000000000fb7a3d0080010000000000007a8d3d008101000000000000b8963d00820100000000000006a03d00830100000000000088b23d008401000000000000c8bb3d0085010000000000000bc53d0086010000000000001dea3d008701000000000000e9053e008801000000000000b5213e0089010000000000003b343e008a01000000000000843d3e008b010000000000005e593e008c010000000000001f913e008d0100000000000065c83e008e010000000000006bed3e008f01000000000000a9f63e009001000000000000f6ff3e009101000000000000c1373f0092010000000000005c4a3f0093010000000000003b663f009401000000000000856f3f009501000000000000cf783f0096010000000000003ea73f009701000000000000ccde3f0098010000000000008516400099010000000000001e2940009a010000000000006e4e40009b01000000000000c35740009c010000000000009b8640009d01000000000000cebe40009e0100000000000001f740009f01000000000000372f4100a00100000000000097384100a10100000000000070674100a201000000000000a99f4100a30100000000000065b24100a401000000000000ddd74100a50100000000000096ea4100a6010000000000000b104200a70100000000000044484200a8010000000000009c514200a9010000000000003b804200aa0100000000000051b84200ab010000000000006fd44200ac010000000000005ef04200ad01000000000000b9f94200ae010000000000006a284300af0100000000000078604300b00100000000000077984300b101000000000000abd04300b20100000000000064e34300b30100000000000072ff4300b401000000000000d2084400b50100000000000008414400b6010000000000002e794400b7010000000000005eb14400b8010000000000007de94400b9010000000000009e214500ba010000000000005d344500bb01000000000000d0594500bc0100000000000006924500bd010000000000001aca4500be010000000000004a024600bf01000000000000603a4600c00100000000000084724600c101000000000000abaa4600c20100000000000047bd4600c3010000000000009ec64600c401000000000000a0e24600c5010000000000005df54600c601000000000000bf1a4700c701000000000000d1524700c8010000000000007f814700c901000000000000dd8a4700ca0100000000000039944700cb01000000000000f2c24700cc0100000000000010fb4700cd01000000000000d5294800ce010000000000002c334800cf01000000000000f9614800d001000000000000596b4800d10100000000000078874800d2010000000000008da34800d301000000000000aadb4800d401000000000000c6134900d501000000000000eb4b4900d601000000000000e7834900d701000000000000f9bb4900d801000000000000b6ce4900d9010000000000001bf44900da010000000000004a2c4a00db0100000000000066644a00dc010000000000002f7d4a00dd0100000000000019994a00de01000000000000c0ab4a00df01000000000000aec74a00e001000000000000fed04a00e101000000000000bbff4a00e20100000000000019094b00e301000000000000902e4b00e40100000000000041414b00e50100000000000010704b00e6010000000000006e794b00e7010000000000002b8c4b00e80100000000000094b14b00e901000000000000a4e94b00ea01000000000000d4214c00eb01000000000000d7594c00ec01000000000000e8914c00ed0100000000000004ae4c00ee01000000000000ebc94c00ef0100000000000014024d00f001000000000000fe394d00f1010000000000000a724d00f201000000000000667b4d00f30100000000000013aa4d00f40100000000000031c64d00f50100000000000037e24d00f6010000000000004afe4d00f7010000000000002c1a4e00f801000000000000ea2c4e00f90100000000000049364e00fa010000000000004e524e00fb01000000000000628a4e00fc0100000000000079a64e00fd010000000000001ab94e00fe0100000000000079c24e00ff0100000000000094de4e000002000000000000aafa4e00010200000000000059324f00020200000000000004654f000302000000000000ff764f0004020000000000000d804f0005020000000000007e924f000602000000000000c29b4f000702000000000000f4d34f000802000000000000160c50000902000000000000504450000a02000000000000877c50000b02000000000000b6b450000c02000000000000e7ec50000d0200000000000046f650000e02000000000000b61b51000f020000000000001625510010020000000000004f5d510011020000000000000f7051001202000000000000889551001302000000000000b5cd5100140200000000000014d751001502000000000000e605520016020000000000001f3e5200170200000000000053765200180200000000000089ae52001902000000000000e8b752001a02000000000000b7e652001b0200000000000074f952001c02000000000000e81e53001d020000000000001a5753001e02000000000000558f53001f020000000000008ac753002002000000000000b9ff53002102000000000000f13754002202000000000000277054002302000000000000418c54002402000000000000d1a354002502000000000000d9c8540026020000000000007edb54002702000000000000b81355002802000000000000e34b55002902000000000000c58355002a02000000000000d6bb55002b0200000000000007f455002c02000000000000c30656002d020000000000002c2c56002e020000000000005d6456002f020000000000008f9c56003002000000000000c9d456003102000000000000070d570032020000000000004345570033020000000000007a7d570034020000000000007d99570035020000000000009ab557003602000000000000b4ed57003702000000000000f225580038020000000000002f5e580039020000000000006b9658003a02000000000000a6ce58003b02000000000000e30659003c02000000000000183f59003d02000000000000517759003e02000000000000ad8059003f020000000000008baf59004002000000000000e9b859004102000000000000c5e75900420200000000000002205a0043020000000000003f585a0044020000000000007c905a004502000000000000bcc85a004602000000000000f1005b004702000000000000111d5b00480200000000000030395b0049020000000000006f715b004a02000000000000aca95b004b02000000000000e9e15b004c02000000000000251a5c004d0200000000000060525c004e020000000000009f8a5c004f02000000000000dbc25c00500200000000000019fb5c00510200000000000058335d005202000000000000956b5d005302000000000000c7a35d005402000000000000f7db5d00550200000000000031145e0056020000000000006f4c5e005702000000000000a7845e005802000000000000e0bc5e0059020000000000003fc65e005a020000000000001cf55e005b02000000000000582d5f005c0200000000000093655f005d02000000000000cf9d5f005e0200000000000005d65f005f02000000000000440e600060020000000000008346600061020000000000006a7e6000620200000000000056b46000630200000000000000ec60006402000000000000a72361006502000000000000e25b61006602000000000000f293610067020000000000001bcc61006802000000000000dade61006902000000000000590462006a02000000000000963c62006b02000000000000cc7462006c020000000000008c8762006d02000000000000ffac62006e020000000000003ae562006f02000000000000731d63007002000000000000b05563007102000000000000e98d630072020000000000001dc6630073020000000000005dfe63007402000000000000993664007502000000000000d86e6400760200000000000017a76400770200000000000051df640078020000000000008a1765007902000000000000c34f65007a02000000000000018865007b020000000000003ec065007c020000000000007af865007d02000000000000b63066007e02000000000000f06866007f0200000000000004a16600800200000000000041d966008102000000000000711167008202000000000000ac4967008302000000000000de8167008402000000000000f8b967008502000000000000b8cc6700860200000000000035f2670087020000000000006e2a680088020000000000001c3d680089020000000000007f6268008a02000000000000ba9a68008b02000000000000f3d268008c02000000000000310b69008d02000000000000704369008e02000000000000ae7b69008f02000000000000eeb3690090020000000000002bec6900910200000000000065246a009202000000000000a45c6a009302000000000000e0946a0094020000000000001dcd6a009502000000000000dbdf6a00960200000000000059056b00970200000000000018186b009802000000000000923d6b009902000000000000b0756b009a02000000000000e6ad6b009b0200000000000021e66b009c020000000000005e1e6c009d0200000000000096566c009e02000000000000d28e6c009f020000000000000ac76c00a00200000000000047ff6c00a10200000000000077376d00a202000000000000876f6d00a3020000000000000fa76d00a40200000000000059dc6d00a50200000000000022146e00a602000000000000464c6e00a70200000000000071846e00a802000000000000eea96e00a902000000000000aabc6e00aa0200000000000085eb6e00ab02000000000000e4f46e00ac020000000000001c2d6f00ad02000000000000da3f6f00ae0200000000000053656f00af020000000000008c9d6f00b002000000000000c4d56f00b102000000000000d90d7000b202000000000000d7457000b302000000000000f67d7000b402000000000000deb57000b502000000000000b2ed7000b602000000000000a9257100b702000000000000975d7100b802000000000000338c7100b9020000000000007e957100ba0200000000000068b17100bb0200000000000050cd7100bc020000000000001c057200bd02000000000000610e7200be02000000000000c13c7200bf020000000000006b747200c0020000000000005aac7200c10200000000000032e47200c202000000000000dcf67200c302000000000000321c7300c4020000000000002b547300c5020000000000007d8b7300c60200000000000020c37300c702000000000000cefa7300c8020000000000003c327400c9020000000000009b697400ca02000000000000eda07400cb0200000000000056d87400cc0200000000000090107500cd02000000000000ad2c7500ce020000000000000b367500cf02000000000000c7487500d002000000000000fe807500d10200000000000039b97500d20200000000000073f17500d30200000000000030047600d4020000000000004b207600d502000000000000a9297600d60200000000000006337600d702000000000000d3617600d80200000000000090747600d902000000000000089a7600da020000000000002fd27600db020000000000001a0a7700dc0200000000000022427700dd02000000000000007a7700de02000000000000d2b17700df02000000000000f8e97700e0020000000000002b227800e102000000000000635a7800e202000000000000a0927800e302000000000000daca7800e40200000000000011037900e502000000000000483b7900e60200000000000085737900e702000000000000b1ab7900e802000000000000dae37900e902000000000000121c7a00ea0200000000000049547a00eb02000000000000878c7a00ec02000000000000bfc47a00ed02000000000000edfc7a00ee0200000000000026357b00ef02000000000000606d7b00f0020000000000009da57b00f102000000000000cddd7b00f20200000000000006167c00f3020000000000003f4e7c00f402000000000000fb607c00f50200000000000077867c00f602000000000000b4be7c00f70200000000000014c87c00f802000000000000e0f67c00f9020000000000001b2f7d00fa0200000000000058677d00fb02000000000000959f7d00fc02000000000000d2d77d00fd02000000000000ec0f7e00fe0200000000000025487e00ff020000000000005f807e0000030000000000009ab87e000103000000000000d3f07e000203000000000000ee0c7f0003030000000000000a297f000403000000000000c53b7f00050300000000000043617f0006030000000000007b997f000703000000000000b9d17f000803000000000000f20980000903000000000000284280000a030000000000005e7a80000b0300000000000099b280000c03000000000000d2ea80000d03000000000000082381000e030000000000003e5b81000f030000000000007b9381001003000000000000b8cb81001103000000000000f30382001203000000000000313c82001303000000000000697482001403000000000000a6ac82001503000000000000c4c882001603000000000000e0e482001703000000000000ff00830018030000000000001e1d83001903000000000000dd2f83001a030000000000005b5583001b03000000000000988d83001c03000000000000d5c583001d0300000000000010fe83001e030000000000004e3684001f03000000000000826e84002003000000000000bba684002103000000000000f5de840022030000000000006f0485002303000000000000cc0d850024030000000000002c1785002503000000000000ea2985002603000000000000634f850027030000000000007e6b850028030000000000009a878500290300000000000017ad85002a03000000000000d2bf85002b0300000000000031c985002c030000000000000ef885002d030000000000004a3086002e03000000000000866886002f03000000000000bea086003003000000000000f2d8860031030000000000002a1187003203000000000000871a870033030000000000006449870034030000000000001d5c87003503000000000000998187003603000000000000cfb987003703000000000000eed5870038030000000000000cf2870039030000000000004a2a88003a03000000000000a83388003b03000000000000826288003c03000000000000b69a88003d03000000000000efd288003e030000000000002d0b89003f030000000000004d27890040030000000000006c4389004103000000000000ab7b89004203000000000000eab38900430300000000000028ec8900440300000000000068248a004503000000000000a05c8a004603000000000000b4948a004703000000000000f4cc8a00480300000000000030058b0049030000000000006f3d8b004a030000000000008e598b004b03000000000000ae758b004c03000000000000ecad8b004d0300000000000028e68b004e03000000000000331e8c004f030000000000004f568c0050030000000000008e8e8c005103000000000000c7c68c00520300000000000005ff8c00530300000000000041378d005403000000000000746f8d005503000000000000a4a78d00560300000000000064ba8d005703000000000000e4df8d0058030000000000000a188e00590300000000000023508e005a0300000000000027888e005b03000000000000d89a8e005c0300000000000043c08e005d0300000000000082f88e005e03000000000000c0308f005f03000000000000ff688f0060030000000000001ba18f00610300000000000059d98f006203000000000000981190006303000000000000d64990006403000000000000f56590006503000000000000158290006603000000000000758b9000670300000000000053ba9000680300000000000092f290006903000000000000d22a91006a03000000000000106391006b03000000000000489b91006c03000000000000a2a491006d030000000000001bd391006e03000000000000530992006f03000000000000d32e9200700300000000000090419200710300000000000074799200720300000000000094b19200730300000000000072e092007403000000000000d2e992007503000000000000b21893007603000000000000122293007703000000000000445a93007803000000000000739293007903000000000000f3b793007a03000000000000abca93007b030000000000005ddd93007c03000000000000c40294007d03000000000000e13a94007e03000000000000217394007f0300000000000059ab9400800300000000000090e394008103000000000000c31b95008203000000000000ea53950083030000000000009866950084030000000000000b8c9500850300000000000046c49500860300000000000057fc950087030000000000008f3496008803000000000000cf6c960089030000000000000ba596008a0300000000000045dd96008b03000000000000a3e696008c03000000000000801597008d03000000000000bc4d97008e03000000000000f78597008f030000000000002ebe9700900300000000000030f6970091030000000000005a2e98009203000000000000956698009303000000000000d49e9800940300000000000014d7980095030000000000003b0f990096030000000000006c4799009703000000000000ac7f9900980300000000000078b79900990300000000000026ca99009a030000000000007cef99009b0300000000000085279a009c03000000000000be5f9a009d03000000000000fd979a009e03000000000000b9aa9a009f0300000000000022d09a00a0030000000000003dec9a00a10300000000000058089b00a20300000000000074249b00a3030000000000008b409b00a403000000000000e4499b00a50300000000000038789b00a60300000000000076819b00a703000000000000e4af9b00a803000000000000b7e79b00a903000000000000731f9c00aa03000000000000a6289c00ab030000000000002f3b9c00ac0300000000000012579c00ad030000000000005d609c00ae03000000000000cb8e9c00af0300000000000057a19c00b00300000000000086c69c00b1030000000000005afe9c00b20300000000000002369d00b303000000000000bc6d9d00b40300000000000099a59d00b5030000000000004edd9d00b603000000000000db149e00b703000000000000e0399e00b803000000000000724c9e00b9030000000000002a849e00ba03000000000000ee9f9e00bb03000000000000d1bb9e00bc030000000000007df39e00bd03000000000000f02a9f00be030000000000006a629f00bf03000000000000ff999f00c0030000000000002ed19f00c1030000000000004608a000c203000000000000893fa000c303000000000000a476a000c403000000000000dfada000c5030000000000001cb7a000c6030000000000003ce5a000c703000000000000921ca100c8030000000000008c53a100c903000000000000988aa100ca0300000000000010a6a100cb03000000000000a0c1a100cc03000000000000e5d3a100cd0300000000000072f8a100ce030000000000007c2fa200cf030000000000003766a200d003000000000000389da200d10300000000000056a6a200d203000000000000a9b8a200d303000000000000cac1a200d4030000000000001ad4a200d503000000000000200ba300d6030000000000002714a300d703000000000000bc41a300d8030000000000006778a300d9030000000000000aafa300da0300000000000046dca300db0300000000000065e5a300dc03000000000000a81ba400dd03000000000000d72da400de030000000000002352a400df030000000000006288a400e003000000000000c1bea400e103000000000000f8f4a400e203000000000000212ba500e3030000000000003f61a500e403000000000000656aa500e503000000000000e497a500e60300000000000040cea500e703000000000000b204a600e803000000000000fc3aa600e9030000000000009471a600ea0300000000000037a8a600eb030000000000001adfa600ec03000000000000ea0ca700ed030000000000000e16a700ee030000000000005228a700ef030000000000007d31a700f003000000000000034da700f1030000000000002084a700f2030000000000004a8da700f303000000000000a99fa700f403000000000000f6baa700f503000000000000c1f1a700f603000000000000be28a800f703000000000000a65fa800f8030000000000003e7ba800f903000000000000c296a800fa03000000000000c3cda800fb03000000000000d504a900fc03000000000000f83ba900fd030000000000005f73a900fe03000000000000ceaaa900ff030000000000000bb4a900000400000000000005e2a90001040000000000005e19aa000204000000000000c12baa0003040000000000008e50aa000404000000000000fd62aa0005040000000000008175aa000604000000000000fa87aa0007040000000000002f91aa0008040000000000005dbfaa000904000000000000a3c8aa000a04000000000000e5f6aa000b04000000000000e41bab000c040000000000005b2eab000d04000000000000e765ab000e040000000000004c9dab000f0400000000000085a6ab001004000000000000b8d4ab001104000000000000fdddab0012040000000000003b0cac001304000000000000d043ac001404000000000000827bac001504000000000000b8a0ac0016040000000000005bb3ac00170400000000000029ebac0018040000000000006af4ac0019040000000000000e07ad001a04000000000000f422ad001b04000000000000432cad001c040000000000009935ad001d04000000000000ee3ead001e04000000000000d55aad001f04000000000000bd76ad002004000000000000a592ad00210400000000000076caad002204000000000000f6dcad002304000000000000e001ae0024040000000000004f39ae0025040000000000001371ae0026040000000000005f7aae002704000000000000fc8cae002804000000000000cda8ae0029040000000000005ebbae002a0400000000000081e0ae002b040000000000004f18af002c040000000000001e50af002d04000000000000e687af002e04000000000000a0bfaf002f040000000000005ff7af003004000000000000042fb0003104000000000000da66b00032040000000000009a9eb000330400000000000063d6b0003404000000000000300eb1003504000000000000da45b10036040000000000009a7db100370400000000000050b5b100380400000000000029edb1003904000000000000971bb2003a04000000000000e024b2003b04000000000000995cb2003c040000000000006694b2003d0400000000000048b0b2003e040000000000002eccb2003f0400000000000075d5b200400400000000000008e8b2004104000000000000e703b3004204000000000000ce1fb3004304000000000000b63bb30044040000000000000d45b30045040000000000009f57b30046040000000000007573b3004704000000000000c67cb30048040000000000003aabb3004904000000000000e4e2b3004a04000000000000651ab4004b04000000000000f951b4004c040000000000009389b4004d0400000000000025c1b4004e04000000000000f6f8b4004f04000000000000241eb5005004000000000000b130b50051040000000000007068b500520400000000000040a0b5005304000000000000ecd7b50054040000000000000510b60055040000000000003e48b60056040000000000007a80b6005704000000000000b7b8b6005804000000000000f3f0b60059040000000000002f29b7005a04000000000000ae4eb7005b040000000000006861b7005c04000000000000a599b7005d04000000000000ded1b7005e040000000000005cf7b7005f04000000000000160ab80060040000000000005042b8006104000000000000964bb8006204000000000000687ab8006304000000000000a6b2b800640400000000000066c5b8006504000000000000e5eab80066040000000000000423b90067040000000000003f5bb90068040000000000005d77b90069040000000000007b93b9006a04000000000000b7cbb9006b04000000000000ef03ba006c04000000000000133cba006d040000000000003358ba006e040000000000005174ba006f0400000000000042acba0070040000000000006ce4ba007104000000000000a21cbb007204000000000000e054bb007304000000000000405ebb0074040000000000001b8dbb0075040000000000002ec5bb0076040000000000006dfdbb007704000000000000a435bc007804000000000000d06dbc0079040000000000000ca6bc007a040000000000004adebc007b040000000000008716bd007c04000000000000c34ebd007d04000000000000fc86bd007e040000000000003bbfbd007f040000000000007af7bd008004000000000000d500be008104000000000000b32fbe008204000000000000ea67be00830400000000000027a0be00840400000000000065d8be008504000000000000a410bf008604000000000000dd48bf0087040000000000003b52bf0088040000000000001881bf0089040000000000008fb8bf008a04000000000000cbc1bf008b04000000000000f8efbf008c040000000000007602c0008d040000000000008327c0008e04000000000000075fc0008f040000000000005d96c000900400000000000009cec00091040000000000003b06c10092040000000000002d3ec10093040000000000006476c10094040000000000007aaec1009504000000000000b9e6c1009604000000000000ef1ec20097040000000000002c57c2009804000000000000698fc20099040000000000008cc7c2009a040000000000009effc2009b04000000000000da37c3009c04000000000000ee6fc3009d0400000000000029a8c3009e0400000000000067e0c3009f04000000000000240fc400a0040000000000008218c400a104000000000000b150c400a204000000000000c088c400a304000000000000d2c0c400a404000000000000f6f8c400a5040000000000001231c500a604000000000000d143c500a7040000000000004d69c500a80400000000000089a1c500a904000000000000c4d9c500aa040000000000000112c600ab040000000000005c1bc600ac040000000000003a4ac600ad040000000000007482c600ae04000000000000abbac600af04000000000000e4f2c600b0040000000000001d2bc700b1040000000000002e47c700b2040000000000004863c700b304000000000000687fc700b404000000000000829bc700b5040000000000009bd3c700b604000000000000d80bc800b7040000000000001144c800b804000000000000704dc800b904000000000000d056c800ba040000000000004e7cc800bb0400000000000080b4c800bc04000000000000b1ecc800bd040000000000009808c900be040000000000008d24c900bf04000000000000c75cc900c004000000000000df94c900c104000000000000feb0c900c2040000000000001dcdc900c3040000000000004605ca00c4040000000000006e3dca00c5040000000000009e75ca00c604000000000000029bca00c704000000000000aeadca00c8040000000000008adcca00c904000000000000eae5ca00ca04000000000000251ecb00cb04000000000000fa55cb00cc04000000000000778ccb00cd04000000000000eec3cb00ce0400000000000005fccb00cf040000000000004134cc00d004000000000000716ccc00d10400000000000096a4cc00d204000000000000d3dccc00d30400000000000086efcc00d4040000000000000215cd00d504000000000000ac27cd00d604000000000000264dcd00d7040000000000008656cd00d8040000000000006385cd00d9040000000000003bb4cd00da0400000000000099bdcd00db04000000000000d8f5cd00dc04000000000000172ece00dd040000000000005366ce00de04000000000000909ece00df04000000000000b7d6ce00e00400000000000068e9ce00e104000000000000cc0ecf00e2040000000000000547cf00e304000000000000427fcf00e40400000000000079b7cf00e504000000000000b8efcf00e604000000000000f427d000e7040000000000000b60d000e8040000000000004698d000e90400000000000083d0d000ea04000000000000c008d100eb04000000000000fa40d100ec040000000000003679d100ed0400000000000073b1d100ee0400000000000087cdd100ef04000000000000a6e9d100f004000000000000e521d200f1040000000000001e5ad200f2040000000000005692d200f30400000000000092cad200f40400000000000052ddd200f504000000000000ce02d300f604000000000000e13ad300f7040000000000003444d300f804000000000000dc56d300f904000000000000ef72d300fa040000000000004d7cd300fb0400000000000024abd300fc04000000000000a1d0d300fd040000000000005be3d300fe04000000000000901bd400ff04000000000000ce53d40000050000000000000a8cd40001050000000000003ac4d40002050000000000004ae0d400030500000000000069fcd4000405000000000000a134d50005050000000000006047d5000605000000000000de6cd50007050000000000001ba5d500080500000000000058ddd50009050000000000009415d6000a05000000000000d24dd6000b05000000000000f085d6000c050000000000001ebed6000d05000000000000fbecd6000e050000000000005bf6d6000f050000000000008b2ed7001005000000000000c566d7001105000000000000029fd700120500000000000036d7d70013050000000000006f0fd80014050000000000009f47d8001505000000000000c97fd8001605000000000000e4b7d80017050000000000001ff0d80018050000000000005928d90019050000000000009560d9001a050000000000005473d9001b05000000000000718fd9001c05000000000000d198d9001d0500000000000031a2d9001e050000000000000fd1d9001f05000000000000cfe3d90020050000000000004f09da0021050000000000008941da002205000000000000b979da002305000000000000edb1da00240500000000000047bbda00250500000000000054d7da00260500000000000007eada00270500000000000067f3da0028050000000000003a22db0029050000000000005e5adb002a050000000000007892db002b05000000000000b0cadb002c05000000000000e702dc002d05000000000000183bdc002e050000000000007644dc002f050000000000002773dc003005000000000000dd85dc0031050000000000004dabdc00320500000000000086e3dc003305000000000000bb1bdd003405000000000000944add003505000000000000f453dd003605000000000000ad66dd003705000000000000298cdd00380500000000000060c4dd0039050000000000009cfcdd003a05000000000000fa05de003b05000000000000d734de003c05000000000000b56cde003d0500000000000045a4de003e05000000000000a1d2de003f05000000000000e4dbde0040050000000000002fe5de0041050000000000003c05df004205000000000000d81adf004305000000000000d636df0044050000000000002840df004505000000000000d252df004605000000000000cf6edf004705000000000000a9a6df004805000000000000eeafdf00490500000000000047b9df004a05000000000000b1dedf004b050000000000000de8df004c050000000000006e0de0004d05000000000000cb16e0004e05000000000000d84ee0004f050000000000007886e0005005000000000000b3bee0005105000000000000c3f6e0005205000000000000fe2ee10053050000000000002c67e1005405000000000000e679e1005505000000000000a68ce1005605000000000000629fe10057050000000000009bd7e10058050000000000005806e2005905000000000000b10fe2005a05000000000000e647e2005b050000000000001880e2005c050000000000007689e2005d050000000000004cb8e2005e050000000000007ef0e2005f05000000000000b228e3006005000000000000e760e30061050000000000002499e300620500000000000060d1e30063050000000000009c09e4006405000000000000d441e4006505000000000000334be40066050000000000000a7ae4006705000000000000e0a8e400680500000000000040b2e40069050000000000006feae4006a05000000000000a022e5006b05000000000000de5ae5006c050000000000001a93e5006d0500000000000055cbe5006e050000000000000bdee5006f050000000000008203e6007005000000000000db0ce6007105000000000000b53be6007205000000000000f073e60073050000000000004e7de60074050000000000002cace60075050000000000008cb5e60076050000000000006be4e6007705000000000000a51ce7007805000000000000dc54e7007905000000000000168de7007a050000000000004ac5e7007b0500000000000057fde7007c050000000000009335e8007d05000000000000d06de8007e050000000000002e77e8007f0500000000000004a6e80080050000000000003fdee80081050000000000007b16e9008205000000000000b74ee9008305000000000000e886e900840500000000000015bfe900850500000000000046f7e9008605000000000000602fea0087050000000000000442ea0088050000000000005a4bea0089050000000000006a67ea008a05000000000000889fea008b05000000000000daa8ea008c0500000000000079d7ea008d050000000000009f0feb008e050000000000005c22eb008f050000000000001c35eb009005000000000000d847eb0091050000000000000e80eb0092050000000000003eb8eb00930500000000000076f0eb009405000000000000ad28ec009505000000000000e660ec0096050000000000002399ec00970500000000000060d1ec0098050000000000009e09ed0099050000000000005e1ced009a05000000000000da41ed009b050000000000009654ed009c050000000000005567ed009d05000000000000127aed009e050000000000004ab2ed009f0500000000000082eaed00a005000000000000e1f3ed00a105000000000000bd22ee00a205000000000000fa5aee00a3050000000000003493ee00a405000000000000929cee00a50500000000000070cbee00a605000000000000ac03ef00a705000000000000eb3bef00a805000000000000fb73ef00a905000000000000feabef00aa05000000000000bebeef00ab0500000000000038e4ef00ac050000000000004e1cf000ad050000000000008854f000ae05000000000000958cf000af05000000000000c5c4f000b005000000000000fffcf000b1050000000000002e35f100b205000000000000de47f100b305000000000000466df100b4050000000000005da5f100b50500000000000094ddf100b605000000000000c115f200b705000000000000fa4df200b8050000000000002d86f200b90500000000000067bef200ba05000000000000a0f6f200bb05000000000000b52ef300bc050000000000003254f300bd05000000000000ef66f300be05000000000000239ff300bf0500000000000032d7f300c005000000000000dde9f300c1050000000000001e0ff400c2050000000000004f47f400c3050000000000008d7ff400c4050000000000006bb7f400c5050000000000009beff400c605000000000000c927f500c705000000000000ff5ff500c8050000000000003198f500c90500000000000063d0f500ca050000000000008908f600cb05000000000000c240f600cc050000000000001d66f600cd05000000000000ca78f600ce05000000000000fbb0f600cf0500000000000031e9f600d0050000000000006021f700d1050000000000009e59f700d205000000000000d891f700d3050000000000000acaf700d4050000000000004402f800d5050000000000007b3af800d605000000000000fa5ff800d705000000000000b672f800d805000000000000ebaaf800d90500000000000048b4f800da0500000000000024e3f800db05000000000000601bf900dc050000000000009753f900dd05000000000000ac8bf900de05000000000000e3c3f900df050000000000001cfcf900e0050000000000005934fa00e105000000000000936cfa00e205000000000000a7a4fa00e305000000000000dfdcfa00e4050000000000001a15fb00e5050000000000004d4dfb00e605000000000000a656fb00e7050000000000007b85fb00e805000000000000a2bdfb00e905000000000000dff5fb00ea050000000000005f1bfc00eb050000000000001e2efc00ec050000000000005266fc00ed050000000000000c79fc00ee05000000000000cc8bfc00ef050000000000002995fc00f005000000000000899efc00f105000000000000c1d6fc00f2050000000000007ee9fc00f3050000000000003dfcfc00f405000000000000f00efd00f5050000000000004c18fd00f6050000000000001a47fd00f7050000000000004a7ffd00f80500000000000086b7fd00f905000000000000beeffd00fa050000000000001ef9fd00fb05000000000000ee27fe00fc050000000000000944fe00fd050000000000002560fe00fe05000000000000307cfe00ff050000000000002798fe000006000000000000e2aafe00010600000000000042b4fe0002060000000000005dd0fe0003060000000000009a08ff000406000000000000ca40ff000506000000000000244aff000606000000000000f278ff0007060000000000002db1ff00080600000000000063e9ff000906000000000000712100010a06000000000000313400010b060000000000004c5000010c06000000000000ac5900010d06000000000000b49100010e06000000000000e3c900010f06000000000000f60101011006000000000000103a010111060000000000003056010112060000000000004c720101130600000000000084aa01011406000000000000c2e201011506000000000000fe1a02011606000000000000235302011706000000000000618b020118060000000000009dc3020119060000000000005ad602011a06000000000000badf02011b06000000000000d7fb02011c06000000000000370503011d06000000000000f71703011e06000000000000133403011f06000000000000516c03012006000000000000107f030121060000000000008da403012206000000000000cadc03012306000000000000f81404012406000000000000324d0401250600000000000070850401260600000000000080bd040127060000000000008bf504012806000000000000842d05012906000000000000d73605012a060000000000008b6505012b06000000000000c19d05012c06000000000000f9d505012d060000000000002e0e06012e06000000000000664606012f060000000000009d7e06013006000000000000d7b60601310600000000000011ef06013206000000000000442707013306000000000000725f07013406000000000000af9707013506000000000000e7cf070136060000000000001f0808013706000000000000372408013806000000000000544008013906000000000000917808013a06000000000000c8b008013b0600000000000001e908013c060000000000000f2109013d06000000000000085909013e06000000000000a99009013f06000000000000b5c809014006000000000000c5000a014106000000000000d2380a01420600000000000006710a014306000000000000f5a80a0144060000000000002be10a01450600000000000012190b01460600000000000048510b01470600000000000086890b014806000000000000e5920b014906000000000000c4c10b014a0600000000000000fa0b014b060000000000001d320c014c060000000000000b6a0c014d06000000000000c5980c014e060000000000001aa20c014f06000000000000d7d00c0150060000000000002dda0c01510600000000000069120d015206000000000000a44a0d015306000000000000df820d0154060000000000001dbb0d01550600000000000055f30d015606000000000000852b0e01570600000000000083630e015806000000000000c39b0e0159060000000000001ba50e015a060000000000007bae0e015b06000000000000f7d30e015c06000000000000afe60e015d06000000000000290c0f015e0600000000000065440f015f06000000000000db690f016006000000000000977c0f016106000000000000d2b40f016206000000000000ecec0f016306000000000000062510016406000000000000ea5c10016506000000000000f49410016606000000000000ffcc100167060000000000005ed610016806000000000000d6fb10016906000000000000340511016a06000000000000613d11016b060000000000008b7511016c06000000000000919111016d06000000000000abad11016e06000000000000e0e511016f060000000000001d1e120170060000000000005556120171060000000000006c8e120172060000000000008aaa12017306000000000000a3c612017406000000000000bdfe12017506000000000000f83613017606000000000000126f130177060000000000006c9413017806000000000000c99d1301790600000000000029a713017a060000000000005bdf13017b06000000000000b8e813017c0600000000000016f213017d060000000000008d1714017e06000000000000ec2014017f06000000000000a43314018006000000000000bc4f14018106000000000000d58714018206000000000000919a1401830600000000000005c0140184060000000000005fc914018506000000000000f8f714018606000000000000a10a15018706000000000000fa1315018806000000000000561d15018906000000000000fa2f15018a06000000000000513915018b06000000000000aa4215018c06000000000000106815018d060000000000002f8415018e060000000000004ba015018f060000000000002cbc15019006000000000000ccce1501910600000000000019d81501920600000000000076e115019306000000000000331016019406000000000000664816019506000000000000998016019606000000000000d5b81601970600000000000093cb16019806000000000000f3d4160199060000000000000ff116019a06000000000000cd0317019b06000000000000492917019c06000000000000a33217019d06000000000000444517019e060000000000003a6117019f06000000000000117d1701a0060000000000001c991701a10600000000000059d11701a2060000000000008c091801a306000000000000c2411801a4060000000000001e4b1801a50600000000000037671801a606000000000000f2791801a7060000000000001fb21801a806000000000000dec41801a90600000000000056ea1801aa0600000000000005fd1801ab0600000000000079221901ac06000000000000b25a1901ad06000000000000e5921901ae06000000000000f9ca1901af060000000000005df01901b00600000000000017031a01b1060000000000003a3b1a01b206000000000000e64d1a01b30600000000000044731a01b406000000000000a37c1a01b50600000000000078ab1a01b6060000000000006ee31a01b706000000000000921b1b01b806000000000000be531b01b9060000000000001d5d1b01ba06000000000000ec8b1b01bb0600000000000009c41b01bc06000000000000e5fb1b01bd06000000000000f1331c01be06000000000000ef6b1c01bf06000000000000a39a1c01c006000000000000fba31c01c106000000000000f2db1c01c206000000000000f8131d01c306000000000000df4b1d01c40600000000000075831d01c506000000000000aaa81d01c6060000000000003bbb1d01c7060000000000002fd71d01c80600000000000017f31d01c90600000000000067fc1d01ca06000000000000ad211e01cb06000000000000fb2a1e01cc0600000000000052341e01cd06000000000000da621e01ce06000000000000c87e1e01cf06000000000000b09a1e01d00600000000000089d21e01d1060000000000000fe51e01d2060000000000005fee1e01d3060000000000003b0a1f01d406000000000000f8411f01d50600000000000098541f01d606000000000000ac5d1f01d70600000000000094791f01d8060000000000006eb11f01d90600000000000038e91f01da060000000000000b212001db06000000000000e6582001dc06000000000000c8902001dd0600000000000062a32001de060000000000007ac82001df060000000000001cdb2001e0060000000000005d002101e10600000000000021382101e206000000000000f76f2101e3060000000000003d792101e406000000000000cea72101e50600000000000095df2101e6060000000000006e172201e706000000000000334f2201e80600000000000085582201e90600000000000010872201ea06000000000000eea22201eb06000000000000cbbe2201ec06000000000000a9da2201ed060000000000009ef62201ee060000000000003d092301ef06000000000000782e2301f0060000000000000c412301f1060000000000005e4a2301f20600000000000045662301f3060000000000003b822301f406000000000000299e2301f506000000000000fed52301f606000000000000990d2401f7060000000000002c202401f806000000000000173c2401f90600000000000063452401fa06000000000000fd572401fb060000000000002a7d2401fc0600000000000000b52401fd06000000000000b8ec2401fe0600000000000037242501ff06000000000000155c25010007000000000000e69325010107000000000000a6cb25010207000000000000630326010307000000000000b30c260104070000000000000916260105070000000000005b1f26010607000000000000523b260107070000000000004857260108070000000000002d732601090700000000000018ab26010a07000000000000fdc626010b07000000000000ede226010c070000000000008d1127010d07000000000000e31a27010e07000000000000cc5227010f07000000000000ac8a270110070000000000004b9d2701110700000000000090c22701120700000000000087fa27011307000000000000583228011407000000000000fe6928011507000000000000557328011607000000000000f4a128011707000000000000ced9280118070000000000007d1129011907000000000000414929011a070000000000001a8129011b07000000000000deb829011c07000000000000bff029011d07000000000000a8282a011e070000000000008b602a011f07000000000000dc692a0120070000000000002d732a0121070000000000007a7c2a012207000000000000198f2a01230700000000000069982a01240700000000000003ab2a0125070000000000004ab42a0126070000000000009ebd2a01270700000000000041d02a012807000000000000e7e22a01290700000000000089f52a012a0700000000000023082b012b07000000000000cb1a2b012c0700000000000018242b012d070000000000006b2d2b012e07000000000000ba362b012f070000000000000e402b013007000000000000af522b013107000000000000035c2b0132070000000000004c652b0133070000000000009b6e2b013407000000000000e4772b013507000000000000abaf2b013607000000000000f8b82b01370700000000000052c22b013807000000000000f0d42b0139070000000000008de72b013a0700000000000081032c013b070000000000005e1f2c013c070000000000004a3b2c013d0700000000000037572c013e070000000000000a8f2c013f070000000000005e982c014007000000000000eeaa2c0141070000000000007fbd2c014207000000000000d2c62c014307000000000000b6fe2c0144070000000000008f362d014507000000000000426e2d014607000000000000d9a52d014707000000000000a0dd2d0148070000000000003df02d0149070000000000004f152e014a07000000000000971e2e014b07000000000000e2272e014c0700000000000035312e014d07000000000000cb432e014e07000000000000174d2e014f07000000000000a57b2e015007000000000000f8842e015107000000000000e0bc2e015207000000000000bdf42e0153070000000000009d2c2f015407000000000000e9352f015507000000000000353f2f015607000000000000cf512f0157070000000000006e642f0158070000000000001b772f015907000000000000659c2f015a070000000000005bd42f015b0700000000000001e72f015c07000000000000470c30015d07000000000000464430015e07000000000000904d30015f07000000000000e4563001" }, "name": "Polkadot", "properties": { diff --git a/artifacts/polkadot_metadata_full.scale b/artifacts/polkadot_metadata_full.scale index ddde0b5f46..e72afe3236 100644 Binary files a/artifacts/polkadot_metadata_full.scale and b/artifacts/polkadot_metadata_full.scale differ diff --git a/artifacts/polkadot_metadata_small.scale b/artifacts/polkadot_metadata_small.scale index af3db68469..900a982b3e 100644 Binary files a/artifacts/polkadot_metadata_small.scale and b/artifacts/polkadot_metadata_small.scale differ diff --git a/artifacts/polkadot_metadata_tiny.scale b/artifacts/polkadot_metadata_tiny.scale index bd9195401d..f601a8d251 100644 Binary files a/artifacts/polkadot_metadata_tiny.scale and b/artifacts/polkadot_metadata_tiny.scale differ diff --git a/cli/Cargo.toml b/cli/Cargo.toml index fe5b70176c..5f0dca45d5 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -15,6 +15,7 @@ description = "Command line utilities for working with subxt codegen" [[bin]] name = "subxt" path = "src/main.rs" +doc = false [lints] workspace = true diff --git a/cli/src/commands/explore/pallets/constants.rs b/cli/src/commands/explore/pallets/constants.rs index dd5e5faddc..a267c401f8 100644 --- a/cli/src/commands/explore/pallets/constants.rs +++ b/cli/src/commands/explore/pallets/constants.rs @@ -64,8 +64,11 @@ pub fn explore_constants( .highlight(); // value - let value = - scale_value::scale::decode_as_type(&mut constant.value(), constant.ty(), metadata.types())?; + let value = scale_value::scale::decode_as_type( + &mut constant.value(), + &constant.ty(), + metadata.types(), + )?; let value = format_scale_value(&value).indent(4); writedoc!( diff --git a/cli/src/commands/explore/pallets/storage.rs b/cli/src/commands/explore/pallets/storage.rs index 0c932c8f1a..543406bd57 100644 --- a/cli/src/commands/explore/pallets/storage.rs +++ b/cli/src/commands/explore/pallets/storage.rs @@ -169,7 +169,7 @@ pub async fn explore_storage( {value_str} "}?; - let key_bytes = value.encode_as_type(type_id, metadata.types())?; + let key_bytes = value.encode_as_type(&type_id, metadata.types())?; let bytes_composite = Value::from_bytes(key_bytes); vec![bytes_composite] } diff --git a/cli/src/commands/explore/runtime_apis/mod.rs b/cli/src/commands/explore/runtime_apis/mod.rs index cdd5681e26..cd233f068a 100644 --- a/cli/src/commands/explore/runtime_apis/mod.rs +++ b/cli/src/commands/explore/runtime_apis/mod.rs @@ -19,7 +19,7 @@ use subxt_metadata::RuntimeApiMetadata; /// Runs for a specified runtime API trait. /// Cases to consider: -/// ```norun +/// ```txt /// method is: /// None => Show pallet docs + available methods /// Some (invalid) => Show Error + available methods @@ -161,9 +161,8 @@ pub async fn run<'a>( {value_str} "}?; // encode, then decode. This ensures that the scale value is of the correct shape for the param: - let bytes = value.encode_as_type(ty.ty, metadata.types())?; - let value = Value::decode_as_type(&mut &bytes[..], ty.ty, metadata.types())? - .map_context(|_| ()); + let bytes = value.encode_as_type(&ty.ty, metadata.types())?; + let value = Value::decode_as_type(&mut &bytes[..], &ty.ty, metadata.types())?; Ok(value) }) .collect::>>()?; diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml index 1cf9638bae..5ffde7e92f 100644 --- a/codegen/Cargo.toml +++ b/codegen/Cargo.toml @@ -26,7 +26,7 @@ syn = { workspace = true } scale-info = { workspace = true } subxt-metadata = { workspace = true } jsonrpsee = { workspace = true, features = ["async-client", "client-ws-transport-native-tls", "http-client"], optional = true } -hex = { workspace = true } +hex = { workspace = true, features = ["std"] } tokio = { workspace = true, features = ["rt-multi-thread"], optional = true } thiserror = { workspace = true } scale-typegen = { workspace = true } diff --git a/codegen/src/api/storage.rs b/codegen/src/api/storage.rs index 9ea3832e94..330843ccf7 100644 --- a/codegen/src/api/storage.rs +++ b/codegen/src/api/storage.rs @@ -8,7 +8,7 @@ use quote::{format_ident, quote}; use scale_info::TypeDef; use scale_typegen::{typegen::type_path::TypePath, TypeGenerator}; use subxt_metadata::{ - PalletMetadata, StorageEntryMetadata, StorageEntryModifier, StorageEntryType, + PalletMetadata, StorageEntryMetadata, StorageEntryModifier, StorageEntryType, StorageHasher, }; use super::CodegenError; @@ -75,8 +75,15 @@ fn generate_storage_entry_fns( let alias_module_name = format_ident!("{snake_case_name}"); let alias_storage_path = quote!( types::#alias_module_name::#alias_name ); - let storage_entry_map = |idx, id| { - let ident: Ident = format_ident!("_{}", idx); + struct MapEntryKey { + arg_name: Ident, + alias_type_def: TokenStream, + alias_type_path: TokenStream, + hasher: StorageHasher, + } + + let map_entry_key = |idx, id, hasher| -> MapEntryKey { + let arg_name: Ident = format_ident!("_{}", idx); let ty_path = type_gen .resolve_type_path(id) .expect("type is in metadata; qed"); @@ -84,34 +91,67 @@ fn generate_storage_entry_fns( let alias_name = format_ident!("Param{}", idx); let alias_type = primitive_type_alias(&ty_path); - let alias_type = quote!( pub type #alias_name = #alias_type; ); - let path_to_alias = quote!( types::#alias_module_name::#alias_name ); + let alias_type_def = quote!( pub type #alias_name = #alias_type; ); + let alias_type_path = quote!( types::#alias_module_name::#alias_name ); - (ident, alias_type, path_to_alias) + MapEntryKey { + arg_name, + alias_type_def, + alias_type_path, + hasher, + } }; - let keys: Vec<(Ident, TokenStream, TokenStream)> = match storage_entry.entry_type() { + let keys: Vec = match storage_entry.entry_type() { StorageEntryType::Plain(_) => vec![], - StorageEntryType::Map { key_ty, .. } => { + StorageEntryType::Map { + key_ty, hashers, .. + } => { match &type_gen .resolve_type(*key_ty) .expect("key type should be present") .type_def { // An N-map; return each of the keys separately. - TypeDef::Tuple(tuple) => tuple - .fields - .iter() - .enumerate() - .map(|(idx, f)| storage_entry_map(idx, f.id)) - .collect::>(), + TypeDef::Tuple(tuple) => { + let key_count = tuple.fields.len(); + let hasher_count = hashers.len(); + if hasher_count != 1 && hasher_count != key_count { + return Err(CodegenError::InvalidStorageHasherCount { + storage_entry_name: storage_entry.name().to_owned(), + key_count, + hasher_count, + }); + } + + let mut map_entry_keys: Vec = vec![]; + for (idx, field) in tuple.fields.iter().enumerate() { + // Note: these are in bounds because of the checks above, qed; + let hasher = if idx >= hasher_count { + hashers[0] + } else { + hashers[idx] + }; + map_entry_keys.push(map_entry_key(idx, field.id, hasher)); + } + map_entry_keys + } // A map with a single key; return the single key. _ => { - vec![storage_entry_map(0, *key_ty)] + let Some(hasher) = hashers.first() else { + return Err(CodegenError::InvalidStorageHasherCount { + storage_entry_name: storage_entry.name().to_owned(), + key_count: 1, + hasher_count: 0, + }); + }; + + vec![map_entry_key(0, *key_ty, *hasher)] } } } }; + let pallet_name = pallet.name(); let storage_name = storage_entry.name(); let Some(storage_hash) = pallet.storage_hash(storage_name) else { @@ -133,6 +173,10 @@ fn generate_storage_entry_fns( StorageEntryModifier::Optional => quote!(()), }; + // Note: putting `#crate_path::storage::address::StaticStorageKey` into this variable is necessary + // to get the line width below a certain limit. If not done, rustfmt will refuse to format the following big expression. + // for more information see [this post](https://users.rust-lang.org/t/rustfmt-silently-fails-to-work/75485/4). + let static_storage_key: TokenStream = quote!(#crate_path::storage::address::StaticStorageKey); let all_fns = (0..=keys.len()).map(|n_keys| { let keys_slice = &keys[..n_keys]; let (fn_name, is_fetchable, is_iterable) = if n_keys == keys.len() { @@ -146,12 +190,65 @@ fn generate_storage_entry_fns( }; (fn_name, false, true) }; - let is_fetchable_type = is_fetchable.then_some(quote!(#crate_path::storage::address::Yes)).unwrap_or(quote!(())); - let is_iterable_type = is_iterable.then_some(quote!(#crate_path::storage::address::Yes)).unwrap_or(quote!(())); - let key_impls = keys_slice.iter().map(|(field_name, _, _)| quote!( #crate_path::storage::address::make_static_storage_map_key(#field_name.borrow()) )); - let key_args = keys_slice.iter().map(|(field_name, _, path_to_alias )| { - quote!( #field_name: impl ::std::borrow::Borrow<#path_to_alias> ) - }); + let is_fetchable_type = is_fetchable + .then_some(quote!(#crate_path::storage::address::Yes)) + .unwrap_or(quote!(())); + let is_iterable_type = is_iterable + .then_some(quote!(#crate_path::storage::address::Yes)) + .unwrap_or(quote!(())); + + let (keys, keys_type) = match keys_slice.len() { + 0 => (quote!(()), quote!(())), + 1 => { + let key = &keys_slice[0]; + if key.hasher.ends_with_key() { + let arg = &key.arg_name; + let keys = quote!(#static_storage_key::new(#arg.borrow())); + let path = &key.alias_type_path; + let path = quote!(#static_storage_key<#path>); + (keys, path) + } else { + (quote!(()), quote!(())) + } + } + _ => { + let keys_iter = keys_slice.iter().map( + |MapEntryKey { + arg_name, hasher, .. + }| { + if hasher.ends_with_key() { + quote!( #static_storage_key::new(#arg_name.borrow()) ) + } else { + quote!(()) + } + }, + ); + let keys = quote!( (#(#keys_iter,)*) ); + let paths_iter = keys_slice.iter().map( + |MapEntryKey { + alias_type_path, + hasher, + .. + }| { + if hasher.ends_with_key() { + quote!( #static_storage_key<#alias_type_path> ) + } else { + quote!(()) + } + }, + ); + let paths = quote!( (#(#paths_iter,)*) ); + (keys, paths) + } + }; + + let key_args = keys_slice.iter().map( + |MapEntryKey { + arg_name, + alias_type_path, + .. + }| quote!( #arg_name: impl ::std::borrow::Borrow<#alias_type_path> ), + ); quote!( #docs @@ -159,7 +256,7 @@ fn generate_storage_entry_fns( &self, #(#key_args,)* ) -> #crate_path::storage::address::Address::< - #crate_path::storage::address::StaticStorageMapKey, + #keys_type, #alias_storage_path, #is_fetchable_type, #is_defaultable_type, @@ -168,14 +265,16 @@ fn generate_storage_entry_fns( #crate_path::storage::address::Address::new_static( #pallet_name, #storage_name, - vec![#(#key_impls,)*], + #keys, [#(#storage_hash,)*] ) } ) }); - let alias_types = keys.iter().map(|(_, alias_type, _)| alias_type); + let alias_types = keys + .iter() + .map(|MapEntryKey { alias_type_def, .. }| alias_type_def); let types_mod_ident = type_gen.types_mod_ident(); // Generate type alias for the return type only, since @@ -231,7 +330,7 @@ mod tests { name, modifier: v15::StorageEntryModifier::Optional, ty: v15::StorageEntryType::Map { - hashers: vec![], + hashers: vec![v15::StorageHasher::Blake2_128Concat], key, value: meta_type::(), }, diff --git a/codegen/src/error.rs b/codegen/src/error.rs index cb95354a20..4a77d247af 100644 --- a/codegen/src/error.rs +++ b/codegen/src/error.rs @@ -39,15 +39,21 @@ pub enum CodegenError { #[error("Call variant for type {0} must have all named fields. Make sure you are providing a valid substrate-based metadata")] InvalidCallVariant(u32), /// Type should be an variant/enum. - #[error( - "{0} type should be an variant/enum type. Make sure you are providing a valid substrate-based metadata" - )] + #[error("{0} type should be an variant/enum type. Make sure you are providing a valid substrate-based metadata")] InvalidType(String), /// Extrinsic call type could not be found. - #[error( - "Extrinsic call type could not be found. Make sure you are providing a valid substrate-based metadata" - )] + #[error("Extrinsic call type could not be found. Make sure you are providing a valid substrate-based metadata")] MissingCallType, + /// There are too many or too few hashers. + #[error("Could not generate functions for storage entry {storage_entry_name}. There are {key_count} keys, but only {hasher_count} hashers. The number of hashers must equal the number of keys or be exactly 1.")] + InvalidStorageHasherCount { + /// The name of the storage entry + storage_entry_name: String, + /// Number of keys + key_count: usize, + /// Number of hashers + hasher_count: usize, + }, /// Cannot generate types. #[error("Type Generation failed: {0}")] TypeGeneration(#[from] TypegenError), diff --git a/examples/parachain-example/Cargo.lock b/examples/parachain-example/Cargo.lock index c49f261820..2739c41f4a 100644 --- a/examples/parachain-example/Cargo.lock +++ b/examples/parachain-example/Cargo.lock @@ -2512,7 +2512,7 @@ dependencies = [ ] [[package]] -name = "sp-core-hashing" +name = "sp-crypto-hashing" version = "13.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb8524f01591ee58b46cd83c9dbc0fcffd2fd730dabec4f59326cd58a00f17e2" @@ -2551,7 +2551,7 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "subxt" -version = "0.34.0" +version = "0.35.0" dependencies = [ "async-trait", "base58", @@ -2573,7 +2573,7 @@ dependencies = [ "scale-value", "serde", "serde_json", - "sp-core-hashing", + "sp-crypto-hashing", "subxt-lightclient", "subxt-macro", "subxt-metadata", @@ -2585,7 +2585,7 @@ dependencies = [ [[package]] name = "subxt-codegen" -version = "0.34.0" +version = "0.35.0" dependencies = [ "frame-metadata 16.0.0", "heck", @@ -2604,7 +2604,7 @@ dependencies = [ [[package]] name = "subxt-lightclient" -version = "0.34.0" +version = "0.35.0" dependencies = [ "futures", "futures-util", @@ -2619,7 +2619,7 @@ dependencies = [ [[package]] name = "subxt-macro" -version = "0.34.0" +version = "0.35.0" dependencies = [ "darling 0.20.3", "parity-scale-codec", @@ -2632,18 +2632,18 @@ dependencies = [ [[package]] name = "subxt-metadata" -version = "0.34.0" +version = "0.35.0" dependencies = [ "frame-metadata 16.0.0", "parity-scale-codec", "scale-info", - "sp-core-hashing", + "sp-crypto-hashing", "thiserror", ] [[package]] name = "subxt-signer" -version = "0.34.0" +version = "0.35.0" dependencies = [ "bip39", "hex", @@ -2655,7 +2655,7 @@ dependencies = [ "secp256k1", "secrecy", "sha2 0.10.8", - "sp-core-hashing", + "sp-crypto-hashing", "subxt", "thiserror", "zeroize", diff --git a/examples/wasm-example/Cargo.lock b/examples/wasm-example/Cargo.lock index 0e00f041a3..87abb8f1d3 100644 --- a/examples/wasm-example/Cargo.lock +++ b/examples/wasm-example/Cargo.lock @@ -466,43 +466,19 @@ dependencies = [ [[package]] name = "darling" -version = "0.14.4" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" dependencies = [ - "darling_core 0.14.4", - "darling_macro 0.14.4", -] - -[[package]] -name = "darling" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" -dependencies = [ - "darling_core 0.20.3", - "darling_macro 0.20.3", + "darling_core", + "darling_macro", ] [[package]] name = "darling_core" -version = "0.14.4" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 1.0.109", -] - -[[package]] -name = "darling_core" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" dependencies = [ "fnv", "ident_case", @@ -514,22 +490,11 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.14.4" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ - "darling_core 0.14.4", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" -dependencies = [ - "darling_core 0.20.3", + "darling_core", "quote", "syn 2.0.48", ] @@ -610,9 +575,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "equivalent" @@ -653,9 +618,6 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ - "byteorder", - "rand", - "rustc-hex", "static_assertions", ] @@ -694,7 +656,6 @@ dependencies = [ "cfg-if", "parity-scale-codec", "scale-info", - "serde", ] [[package]] @@ -1227,15 +1188,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - [[package]] name = "impl-serde" version = "0.4.0" @@ -1329,18 +1281,18 @@ checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "js-sys" -version = "0.3.67" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] [[package]] name = "jsonrpsee" -version = "0.21.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9579d0ca9fb30da026bac2f0f7d9576ec93489aeb7cd4971dd5b4617d82c79b2" +checksum = "16fcc9dd231e72d22993f1643d5f7f0db785737dbe3c3d7ca222916ab4280795" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -1350,9 +1302,9 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.21.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9f9ed46590a8d5681975f126e22531698211b926129a40a2db47cbca429220" +checksum = "0476c96eb741b40d39dcb39d0124e3b9be9840ec77653c42a0996563ae2a53f7" dependencies = [ "futures-channel", "futures-util", @@ -1373,9 +1325,9 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.21.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "776d009e2f591b78c038e0d053a796f94575d66ca4e77dd84bfc5e81419e436c" +checksum = "b974d8f6139efbe8425f32cb33302aba6d5e049556b5bfc067874e7a0da54a2e" dependencies = [ "anyhow", "async-lock", @@ -1398,9 +1350,9 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.21.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b7de9f3219d95985eb77fd03194d7c1b56c19bce1abfcc9d07462574b15572" +checksum = "19dc795a277cff37f27173b3ca790d042afcc0372c34a7ca068d2e76de2cb6d1" dependencies = [ "async-trait", "hyper", @@ -1418,9 +1370,9 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.21.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3266dfb045c9174b24c77c2dfe0084914bb23a6b2597d70c9dc6018392e1cd1b" +checksum = "b13dac43c1a9fc2648b37f306b0a5b0e29b2a6e1c36a33b95c1948da2494e9c5" dependencies = [ "anyhow", "beef", @@ -1713,18 +1665,18 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", @@ -1794,9 +1746,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", - "impl-codec", - "impl-serde", - "scale-info", "uint", ] @@ -1947,12 +1896,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - [[package]] name = "rustc_version" version = "0.4.0" @@ -2084,71 +2027,42 @@ checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "scale-bits" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "036575c29af9b6e4866ffb7fa055dbf623fe7a9cc159b33786de6013a6969d89" +checksum = "662d10dcd57b1c2a3c41c9cf68f71fb09747ada1ea932ad961aca7e2ca28315f" dependencies = [ "parity-scale-codec", "scale-info", + "scale-type-resolver", "serde", ] [[package]] name = "scale-decode" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7caaf753f8ed1ab4752c6afb20174f03598c664724e0e32628e161c21000ff76" +checksum = "afc79ba56a1c742f5aeeed1f1801f3edf51f7e818f0a54582cac6f131364ea7b" dependencies = [ "derive_more", "parity-scale-codec", - "primitive-types", "scale-bits", - "scale-decode-derive", - "scale-info", + "scale-type-resolver", "smallvec", ] -[[package]] -name = "scale-decode-derive" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3475108a1b62c7efd1b5c65974f30109a598b2f45f23c9ae030acb9686966db" -dependencies = [ - "darling 0.14.4", - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "scale-encode" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d70cb4b29360105483fac1ed567ff95d65224a14dd275b6303ed0a654c78de5" +checksum = "628800925a33794fb5387781b883b5e14d130fece9af5a63613867b8de07c5c7" dependencies = [ "derive_more", "parity-scale-codec", - "primitive-types", "scale-bits", - "scale-encode-derive", - "scale-info", + "scale-type-resolver", "smallvec", ] -[[package]] -name = "scale-encode-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "995491f110efdc6bea96d6a746140e32bfceb4ea47510750a5467295a4707a25" -dependencies = [ - "darling 0.14.4", - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "scale-info" version = "2.10.0" @@ -2176,10 +2090,20 @@ dependencies = [ ] [[package]] -name = "scale-typegen" +name = "scale-type-resolver" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00860983481ac590ac87972062909bef0d6a658013b592ccc0f2feb272feab11" +checksum = "10b800069bfd43374e0f96f653e0d46882a2cb16d6d961ac43bea80f26c76843" +dependencies = [ + "scale-info", + "smallvec", +] + +[[package]] +name = "scale-typegen" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6108609f017741c78d35967c7afe4aeaa3999b848282581041428e10d23b63" dependencies = [ "proc-macro2", "quote", @@ -2190,12 +2114,10 @@ dependencies = [ [[package]] name = "scale-value" -version = "0.13.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58223c7691bf0bd46b43c9aea6f0472d1067f378d574180232358d7c6e0a8089" +checksum = "c07ccfee963104335c971aaf8b7b0e749be8569116322df23f1f75c4ca9e4a28" dependencies = [ - "base58", - "blake2", "derive_more", "either", "frame-metadata 15.1.0", @@ -2204,8 +2126,7 @@ dependencies = [ "scale-decode", "scale-encode", "scale-info", - "serde", - "yap", + "scale-type-resolver", ] [[package]] @@ -2289,9 +2210,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] @@ -2318,9 +2239,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", @@ -2329,9 +2250,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -2539,10 +2460,10 @@ dependencies = [ ] [[package]] -name = "sp-core-hashing" -version = "13.0.0" +name = "sp-crypto-hashing" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb8524f01591ee58b46cd83c9dbc0fcffd2fd730dabec4f59326cd58a00f17e2" +checksum = "1e0f4990add7b2cefdeca883c0efa99bb4d912cb2196120e1500c0cc099553b0" dependencies = [ "blake2b_simd", "byteorder", @@ -2578,7 +2499,7 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "subxt" -version = "0.34.0" +version = "0.35.0" dependencies = [ "async-trait", "base58", @@ -2601,7 +2522,7 @@ dependencies = [ "scale-value", "serde", "serde_json", - "sp-core-hashing", + "sp-crypto-hashing", "subxt-lightclient", "subxt-macro", "subxt-metadata", @@ -2612,7 +2533,7 @@ dependencies = [ [[package]] name = "subxt-codegen" -version = "0.34.0" +version = "0.35.0" dependencies = [ "frame-metadata 16.0.0", "getrandom", @@ -2632,7 +2553,7 @@ dependencies = [ [[package]] name = "subxt-lightclient" -version = "0.34.0" +version = "0.35.0" dependencies = [ "futures", "futures-timer", @@ -2657,9 +2578,9 @@ dependencies = [ [[package]] name = "subxt-macro" -version = "0.34.0" +version = "0.35.0" dependencies = [ - "darling 0.20.3", + "darling", "parity-scale-codec", "proc-macro-error", "quote", @@ -2670,13 +2591,14 @@ dependencies = [ [[package]] name = "subxt-metadata" -version = "0.34.0" +version = "0.35.0" dependencies = [ + "derive_more", "frame-metadata 16.0.0", + "hashbrown 0.14.3", "parity-scale-codec", "scale-info", - "sp-core-hashing", - "thiserror", + "sp-crypto-hashing", ] [[package]] @@ -2709,18 +2631,18 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", @@ -2744,9 +2666,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.1" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", @@ -3010,9 +2932,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.90" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -3020,9 +2942,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.90" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", @@ -3047,9 +2969,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.90" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3057,9 +2979,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.90" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", @@ -3070,9 +2992,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.90" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "wasm-example" @@ -3134,9 +3056,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.67" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -3304,12 +3226,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "yap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4524214bc4629eba08d78ceb1d6507070cc0bcbbed23af74e19e6e924a24cf" - [[package]] name = "yew" version = "0.20.0" diff --git a/examples/wasm-example/Cargo.toml b/examples/wasm-example/Cargo.toml index 80d3be6ce7..6aaf175b54 100644 --- a/examples/wasm-example/Cargo.toml +++ b/examples/wasm-example/Cargo.toml @@ -9,10 +9,10 @@ edition = "2021" futures = "0.3.28" subxt = { path = "../../subxt", default-features = false, features = ["jsonrpsee", "web"], target_arch = "wasm32" } yew = { version = "0.20.0", features = ["csr"] } -web-sys = "0.3.63" +web-sys = "0.3.69" hex = "0.4.3" yew-router = "0.17.0" -js-sys = "0.3.63" +js-sys = "0.3.69" wasm-bindgen = "0.2.86" wasm-bindgen-futures = "0.4.36" anyhow = "1.0.71" diff --git a/examples/wasm-example/src/routes/signing.rs b/examples/wasm-example/src/routes/signing.rs index db6d059ada..7891ef92f8 100644 --- a/examples/wasm-example/src/routes/signing.rs +++ b/examples/wasm-example/src/routes/signing.rs @@ -7,6 +7,7 @@ use subxt::ext::codec::{Decode, Encode}; use subxt::tx::SubmittableExtrinsic; use subxt::tx::TxPayload; use subxt::utils::{AccountId32, MultiSignature}; +use subxt::config::DefaultExtrinsicParamsBuilder; use crate::services::{extension_signature_for_extrinsic, get_accounts, polkadot, Account}; use web_sys::HtmlInputElement; @@ -155,7 +156,8 @@ impl Component for SigningExamplesComponent { return Message::Error(anyhow!("MultiSignature Decoding")); }; - let Ok(partial_signed) = api.tx().create_partial_signed_with_nonce(&remark_call, account_nonce, Default::default()) else { + let params = DefaultExtrinsicParamsBuilder::new().nonce(account_nonce).build(); + let Ok(partial_signed) = api.tx().create_partial_signed_offline(&remark_call, params) else { return Message::Error(anyhow!("PartialExtrinsic creation failed")); }; diff --git a/lightclient/Cargo.toml b/lightclient/Cargo.toml index eb079b3e90..d7abdf87f6 100644 --- a/lightclient/Cargo.toml +++ b/lightclient/Cargo.toml @@ -24,23 +24,14 @@ default = ["native"] # Exactly 1 of "web" and "native" is expected. native = [ "smoldot-light/std", - "tokio-stream", - "tokio/sync", "tokio/rt", - "futures-util", ] # Enable this for web/wasm builds. # Exactly 1 of "web" and "native" is expected. web = [ "getrandom/js", - - "smoldot", "smoldot/std", - "smoldot-light", - "tokio-stream", - "tokio/sync", - "futures-util", # For the light-client platform. "wasm-bindgen-futures", @@ -56,29 +47,26 @@ web = [ ] [dependencies] -futures = { workspace = true } +futures = { workspace = true, features = ["async-await"] } serde = { workspace = true, features = ["derive"] } -serde_json = { workspace = true, features = ["raw_value"] } +serde_json = { workspace = true, features = ["default", "raw_value"] } thiserror = { workspace = true } tracing = { workspace = true } +smoldot-light = { workspace = true } +tokio-stream = { workspace = true } +tokio = { workspace = true, features = ["sync"] } +futures-util = { workspace = true } -# Light client support: -smoldot = { workspace = true, optional = true } -smoldot-light = { workspace = true, optional = true } -either = { workspace = true, optional = true } -tokio = { workspace = true, optional = true } -tokio-stream = { workspace = true, optional = true } -futures-util = { workspace = true, optional = true } +# Only needed for web js-sys = { workspace = true, optional = true } send_wrapper = { workspace = true, optional = true } web-sys = { workspace = true, optional = true } wasm-bindgen = { workspace = true, optional = true } wasm-bindgen-futures = { workspace = true, optional = true } +smoldot = { workspace = true, optional = true } +pin-project = { workspace = true, optional = true } futures-timer = { workspace = true, optional = true } instant = { workspace = true, optional = true } -pin-project = { workspace = true, optional = true } - -# Included if "web" feature is enabled, to enable its js feature. getrandom = { workspace = true, optional = true } [package.metadata.docs.rs] diff --git a/lightclient/src/background.rs b/lightclient/src/background.rs index b755b383b7..e9bd9424e3 100644 --- a/lightclient/src/background.rs +++ b/lightclient/src/background.rs @@ -1,43 +1,47 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// Copyright 2019-2024 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. -use futures::stream::StreamExt; -use futures_util::future::{self, Either}; -use serde::Deserialize; +use crate::rpc::RpcResponse; +use crate::shared_client::SharedClient; +use crate::{JsonRpcError, LightClientRpcError}; +use futures::{stream::StreamExt, FutureExt}; use serde_json::value::RawValue; use smoldot_light::platform::PlatformRef; use std::{collections::HashMap, str::FromStr}; use tokio::sync::{mpsc, oneshot}; +use tokio_stream::wrappers::UnboundedReceiverStream; -use crate::client::AddedChain; +const LOG_TARGET: &str = "subxt-light-client-background-task"; -use super::LightClientRpcError; -use smoldot_light::ChainId; - -const LOG_TARGET: &str = "subxt-light-client-background"; - -/// The response of an RPC method. +/// Response from [`BackgroundTaskHandle::request()`]. pub type MethodResponse = Result, LightClientRpcError>; +/// Response from [`BackgroundTaskHandle::subscribe()`]. +pub type SubscriptionResponse = Result< + ( + SubscriptionId, + mpsc::UnboundedReceiver, JsonRpcError>>, + ), + LightClientRpcError, +>; + +/// Type of subscription IDs we can get back. +pub type SubscriptionId = String; + /// Message protocol between the front-end client that submits the RPC requests -/// and the backend handler that produces responses from the chain. -/// -/// The light client uses a single object [`smoldot_light::JsonRpcResponses`] to -/// handle all requests and subscriptions from a chain. A background task is spawned -/// to multiplex the rpc responses and to provide them back to their rightful submitters. +/// and the background task which fetches responses from Smoldot. Hidden behind +/// the [`BackgroundTaskHandle`]. #[derive(Debug)] -pub enum FromSubxt { +enum Message { /// The RPC method request. Request { /// The method of the request. method: String, /// The parameters of the request. - params: String, - /// Channel used to send back the result. + params: Option>, + /// Channel used to send back the method response. sender: oneshot::Sender, - /// The ID of the chain used to identify the chain. - chain_id: ChainId, }, /// The RPC subscription (pub/sub) request. Subscription { @@ -46,29 +50,160 @@ pub enum FromSubxt { /// The method to unsubscribe. unsubscribe_method: String, /// The parameters of the request. - params: String, - /// Channel used to send back the subscription ID if successful. - sub_id: oneshot::Sender, - /// Channel used to send back the notifications. - sender: mpsc::UnboundedSender>, - /// The ID of the chain used to identify the chain. - chain_id: ChainId, + params: Option>, + /// Channel used to send back the subscription response. + sender: oneshot::Sender, }, } -/// Background task data. -#[allow(clippy::type_complexity)] -pub struct BackgroundTask { - /// Smoldot light client implementation that leverages the exposed platform. - client: smoldot_light::Client, - /// Per-chain data. - chain_data: HashMap, +/// A handle to communicate with the background task. +#[derive(Clone, Debug)] +pub struct BackgroundTaskHandle { + to_backend: mpsc::UnboundedSender, } -/// The data that we store for each chain. -#[derive(Default)] -struct ChainData { - /// Generates an unique monotonically increasing ID for each chain. +impl BackgroundTaskHandle { + /// Make an RPC request via the background task. + pub async fn request(&self, method: String, params: Option>) -> MethodResponse { + let (tx, rx) = oneshot::channel(); + self.to_backend + .send(Message::Request { + method, + params, + sender: tx, + }) + .map_err(|_e| LightClientRpcError::BackgroundTaskDropped)?; + + match rx.await { + Err(_e) => Err(LightClientRpcError::BackgroundTaskDropped), + Ok(response) => response, + } + } + + /// Subscribe to some RPC method via the background task. + pub async fn subscribe( + &self, + method: String, + params: Option>, + unsubscribe_method: String, + ) -> SubscriptionResponse { + let (tx, rx) = oneshot::channel(); + self.to_backend + .send(Message::Subscription { + method, + params, + unsubscribe_method, + sender: tx, + }) + .map_err(|_e| LightClientRpcError::BackgroundTaskDropped)?; + + match rx.await { + Err(_e) => Err(LightClientRpcError::BackgroundTaskDropped), + Ok(response) => response, + } + } +} + +/// A background task which runs with [`BackgroundTask::run()`] and manages messages +/// coming to/from Smoldot. +#[allow(clippy::type_complexity)] +pub struct BackgroundTask { + channels: BackgroundTaskChannels, + data: BackgroundTaskData, +} + +impl BackgroundTask { + /// Constructs a new [`BackgroundTask`]. + pub(crate) fn new( + client: SharedClient, + chain_id: smoldot_light::ChainId, + from_back: smoldot_light::JsonRpcResponses, + ) -> (BackgroundTask, BackgroundTaskHandle) { + let (tx, rx) = mpsc::unbounded_channel(); + + let bg_task = BackgroundTask { + channels: BackgroundTaskChannels { + from_front: UnboundedReceiverStream::new(rx), + from_back, + }, + data: BackgroundTaskData { + client, + chain_id, + last_request_id: 0, + pending_subscriptions: HashMap::new(), + requests: HashMap::new(), + subscriptions: HashMap::new(), + }, + }; + + let bg_handle = BackgroundTaskHandle { to_backend: tx }; + + (bg_task, bg_handle) + } + + /// Run the background task, which: + /// - Forwards messages/subscription requests to Smoldot from the front end. + /// - Forwards responses back from Smoldot to the front end. + pub async fn run(self) { + let chain_id = self.data.chain_id; + let mut channels = self.channels; + let mut data = self.data; + + loop { + tokio::pin! { + let from_front_fut = channels.from_front.next().fuse(); + let from_back_fut = channels.from_back.next().fuse(); + } + + futures::select! { + // Message coming from the front end/client. + front_message = from_front_fut => { + let Some(message) = front_message else { + tracing::trace!(target: LOG_TARGET, "Subxt channel closed"); + break; + }; + tracing::trace!( + target: LOG_TARGET, + "Received register message {:?}", + message + ); + + data.handle_requests(message).await; + }, + // Message coming from Smoldot. + back_message = from_back_fut => { + let Some(back_message) = back_message else { + tracing::trace!(target: LOG_TARGET, "Smoldot RPC responses channel closed"); + break; + }; + tracing::trace!( + target: LOG_TARGET, + "Received smoldot RPC chain {:?} result {:?}", + chain_id, back_message + ); + + data.handle_rpc_response(back_message); + } + } + } + + tracing::trace!(target: LOG_TARGET, "Task closed"); + } +} + +struct BackgroundTaskChannels { + /// Messages sent into this background task from the front end. + from_front: UnboundedReceiverStream, + /// Messages sent into the background task from Smoldot. + from_back: smoldot_light::JsonRpcResponses, +} + +struct BackgroundTaskData { + /// A smoldot light client that can be shared. + client: SharedClient, + /// Knowing the chain ID helps with debugging, but isn't overwise necessary. + chain_id: smoldot_light::ChainId, + /// Know which Id to use next for new requests/subscriptions. last_request_id: usize, /// Map the request ID of a RPC method to the frontend `Sender`. requests: HashMap>, @@ -78,20 +213,12 @@ struct ChainData { /// The RPC method request is made in the background and the response should /// not be sent back to the user. /// Map the request ID of a RPC method to the frontend `Sender`. - id_to_subscription: HashMap, + pending_subscriptions: HashMap, /// Map the subscription ID to the frontend `Sender`. /// /// The subscription ID is entirely generated by the node (smoldot). Therefore, it is /// possible for two distinct subscriptions of different chains to have the same subscription ID. - subscriptions: HashMap, -} - -impl ChainData { - /// Fetch and increment the request ID. - fn next_id(&mut self) -> usize { - self.last_request_id = self.last_request_id.wrapping_add(1); - self.last_request_id - } + subscriptions: HashMap, } /// The state needed to resolve the subscription ID and send @@ -100,72 +227,52 @@ struct PendingSubscription { /// Send the method response ID back to the user. /// /// It contains the subscription ID if successful, or an JSON RPC error object. - sub_id_sender: oneshot::Sender, - /// The subscription state that is added to the `subscriptions` map only - /// if the subscription ID is successfully sent back to the user. - subscription_state: ActiveSubscription, -} - -impl PendingSubscription { - /// Transforms the pending subscription into an active subscription. - fn into_parts(self) -> (oneshot::Sender, ActiveSubscription) { - (self.sub_id_sender, self.subscription_state) - } -} - -/// The state of the subscription. -struct ActiveSubscription { - /// Channel to send the subscription notifications back to frontend. - sender: mpsc::UnboundedSender>, + response_sender: oneshot::Sender, /// The unsubscribe method to call when the user drops the receiver /// part of the channel. unsubscribe_method: String, } -impl BackgroundTask { - /// Constructs a new [`BackgroundTask`]. - pub fn new( - client: smoldot_light::Client, - ) -> BackgroundTask { - BackgroundTask { - client, - chain_data: Default::default(), - } - } +/// The state of the subscription. +struct ActiveSubscription { + /// Channel to send the subscription notifications back to frontend. + notification_sender: mpsc::UnboundedSender, JsonRpcError>>, + /// The unsubscribe method to call when the user drops the receiver + /// part of the channel. + unsubscribe_method: String, +} - fn for_chain_id( - &mut self, - chain_id: smoldot_light::ChainId, - ) -> ( - &mut ChainData, - &mut smoldot_light::Client, - ) { - let chain_data = self.chain_data.entry(chain_id).or_default(); - let client = &mut self.client; - (chain_data, client) +impl BackgroundTaskData { + /// Fetch and increment the request ID. + fn next_id(&mut self) -> usize { + self.last_request_id = self.last_request_id.wrapping_add(1); + self.last_request_id } /// Handle the registration messages received from the user. - async fn handle_requests(&mut self, message: FromSubxt) { + async fn handle_requests(&mut self, message: Message) { match message { - FromSubxt::Request { + Message::Request { method, params, sender, - chain_id, } => { - let (chain_data, client) = self.for_chain_id(chain_id); - let id = chain_data.next_id(); + let id = self.next_id(); + let chain_id = self.chain_id; + let params = match ¶ms { + Some(params) => params.get(), + None => "null", + }; let request = format!( r#"{{"jsonrpc":"2.0","id":"{}", "method":"{}","params":{}}}"#, id, method, params ); - chain_data.requests.insert(id, sender); + self.requests.insert(id, sender); tracing::trace!(target: LOG_TARGET, "Tracking request id={id} chain={chain_id:?}"); - let result = client.json_rpc_request(request, chain_id); + let result = self.client.json_rpc_request(request, chain_id); if let Err(err) = result { tracing::warn!( target: LOG_TARGET, @@ -173,14 +280,14 @@ impl BackgroundTask { err.to_string() ); - let sender = chain_data + let sender = self .requests .remove(&id) .expect("Channel is inserted above; qed"); // Send the error back to frontend. if sender - .send(Err(LightClientRpcError::Request(err.to_string()))) + .send(Err(LightClientRpcError::SmoldotError(err.to_string()))) .is_err() { tracing::warn!( @@ -192,52 +299,49 @@ impl BackgroundTask { tracing::trace!(target: LOG_TARGET, "Submitted to smoldot request with id={id}"); } } - FromSubxt::Subscription { + Message::Subscription { method, unsubscribe_method, params, - sub_id, sender, - chain_id, } => { - let (chain_data, client) = self.for_chain_id(chain_id); - let id = chain_data.next_id(); + let id = self.next_id(); + let chain_id = self.chain_id; // For subscriptions we need to make a plain RPC request to the subscription method. // The server will return as a result the subscription ID. + let params = match ¶ms { + Some(params) => params.get(), + None => "null", + }; let request = format!( r#"{{"jsonrpc":"2.0","id":"{}", "method":"{}","params":{}}}"#, id, method, params ); tracing::trace!(target: LOG_TARGET, "Tracking subscription request id={id} chain={chain_id:?}"); - let subscription_id_state = PendingSubscription { - sub_id_sender: sub_id, - subscription_state: ActiveSubscription { - sender, - unsubscribe_method, - }, + let pending_subscription = PendingSubscription { + response_sender: sender, + unsubscribe_method, }; - chain_data - .id_to_subscription - .insert(id, subscription_id_state); + self.pending_subscriptions.insert(id, pending_subscription); - let result = client.json_rpc_request(request, chain_id); + let result = self.client.json_rpc_request(request, chain_id); if let Err(err) = result { tracing::warn!( target: LOG_TARGET, "Cannot send RPC request to lightclient {:?}", err.to_string() ); - let subscription_id_state = chain_data - .id_to_subscription + let subscription_id_state = self + .pending_subscriptions .remove(&id) .expect("Channels are inserted above; qed"); // Send the error back to frontend. if subscription_id_state - .sub_id_sender - .send(Err(LightClientRpcError::Request(err.to_string()))) + .response_sender + .send(Err(LightClientRpcError::SmoldotError(err.to_string()))) .is_err() { tracing::warn!( @@ -253,20 +357,75 @@ impl BackgroundTask { } /// Parse the response received from the light client and sent it to the appropriate user. - fn handle_rpc_response(&mut self, chain_id: smoldot_light::ChainId, response: String) { - tracing::trace!(target: LOG_TARGET, "Received from smoldot response={response} chain={chain_id:?}"); - let (chain_data, _client) = self.for_chain_id(chain_id); + fn handle_rpc_response(&mut self, response: String) { + let chain_id = self.chain_id; + tracing::trace!(target: LOG_TARGET, "Received from smoldot response='{response}' chain={chain_id:?}"); match RpcResponse::from_str(&response) { - Ok(RpcResponse::Error { id, error }) => { + Ok(RpcResponse::Method { id, result }) => { + let Ok(id) = id.parse::() else { + tracing::warn!(target: LOG_TARGET, "Cannot send response. Id={id} chain={chain_id:?} is not a valid number"); + return; + }; + + // Send the response back. + if let Some(sender) = self.requests.remove(&id) { + if sender.send(Ok(result)).is_err() { + tracing::warn!( + target: LOG_TARGET, + "Cannot send method response to id={id} chain={chain_id:?}", + ); + } + } else if let Some(pending_subscription) = self.pending_subscriptions.remove(&id) { + let Ok(sub_id) = serde_json::from_str::(result.get()) else { + tracing::warn!( + target: LOG_TARGET, + "Subscription id='{result}' chain={chain_id:?} is not a valid string", + ); + return; + }; + + tracing::trace!(target: LOG_TARGET, "Received subscription id={sub_id} chain={chain_id:?}"); + + let (sub_tx, sub_rx) = mpsc::unbounded_channel(); + + // Send the method response and a channel to receive notifications back. + if pending_subscription + .response_sender + .send(Ok((sub_id.clone(), sub_rx))) + .is_err() + { + tracing::warn!( + target: LOG_TARGET, + "Cannot send subscription ID response to id={id} chain={chain_id:?}", + ); + return; + } + + // Store the other end of the notif channel to send future subscription notifications to. + self.subscriptions.insert( + sub_id, + ActiveSubscription { + notification_sender: sub_tx, + unsubscribe_method: pending_subscription.unsubscribe_method, + }, + ); + } else { + tracing::warn!( + target: LOG_TARGET, + "Response id={id} chain={chain_id:?} is not tracked", + ); + } + } + Ok(RpcResponse::MethodError { id, error }) => { let Ok(id) = id.parse::() else { tracing::warn!(target: LOG_TARGET, "Cannot send error. Id={id} chain={chain_id:?} is not a valid number"); return; }; - if let Some(sender) = chain_data.requests.remove(&id) { + if let Some(sender) = self.requests.remove(&id) { if sender - .send(Err(LightClientRpcError::Request(error.to_string()))) + .send(Err(LightClientRpcError::JsonRpcError(JsonRpcError(error)))) .is_err() { tracing::warn!( @@ -274,12 +433,10 @@ impl BackgroundTask { "Cannot send method response to id={id} chain={chain_id:?}", ); } - } else if let Some(subscription_id_state) = - chain_data.id_to_subscription.remove(&id) - { + } else if let Some(subscription_id_state) = self.pending_subscriptions.remove(&id) { if subscription_id_state - .sub_id_sender - .send(Err(LightClientRpcError::Request(error.to_string()))) + .response_sender + .send(Err(LightClientRpcError::JsonRpcError(JsonRpcError(error)))) .is_err() { tracing::warn!( @@ -289,93 +446,44 @@ impl BackgroundTask { } } } - Ok(RpcResponse::Method { id, result }) => { - let Ok(id) = id.parse::() else { - tracing::warn!(target: LOG_TARGET, "Cannot send response. Id={id} chain={chain_id:?} is not a valid number"); - return; - }; - - // Send the response back. - if let Some(sender) = chain_data.requests.remove(&id) { - if sender.send(Ok(result)).is_err() { - tracing::warn!( - target: LOG_TARGET, - "Cannot send method response to id={id} chain={chain_id:?}", - ); - } - } else if let Some(pending_subscription) = chain_data.id_to_subscription.remove(&id) - { - let Ok(sub_id) = result - .get() - .trim_start_matches('"') - .trim_end_matches('"') - .parse::() - else { - tracing::warn!( - target: LOG_TARGET, - "Subscription id={result} chain={chain_id:?} is not a valid number", - ); - return; - }; - - tracing::trace!(target: LOG_TARGET, "Received subscription id={sub_id} chain={chain_id:?}"); - - let (sub_id_sender, active_subscription) = pending_subscription.into_parts(); - if sub_id_sender.send(Ok(result)).is_err() { - tracing::warn!( - target: LOG_TARGET, - "Cannot send method response to id={id} chain={chain_id:?}", - ); - - return; - } - - // Track this subscription ID if send is successful. - chain_data.subscriptions.insert(sub_id, active_subscription); - } else { + Ok(RpcResponse::Notification { + method, + subscription_id, + result, + }) => { + let Some(active_subscription) = self.subscriptions.get_mut(&subscription_id) else { tracing::warn!( target: LOG_TARGET, - "Response id={id} chain={chain_id:?} is not tracked", + "Subscription response id={subscription_id} chain={chain_id:?} method={method} is not tracked", ); + return; + }; + if active_subscription + .notification_sender + .send(Ok(result)) + .is_err() + { + self.unsubscribe(&subscription_id, chain_id); } } - Ok(RpcResponse::Subscription { method, id, result }) => { - let Ok(id) = id.parse::() else { - tracing::warn!(target: LOG_TARGET, "Cannot send subscription. Id={id} chain={chain_id:?} is not a valid number"); - return; - }; - - let Some(subscription_state) = chain_data.subscriptions.get_mut(&id) else { + Ok(RpcResponse::NotificationError { + method, + subscription_id, + error, + }) => { + let Some(active_subscription) = self.subscriptions.get_mut(&subscription_id) else { tracing::warn!( target: LOG_TARGET, - "Subscription response id={id} chain={chain_id:?} method={method} is not tracked", + "Subscription error id={subscription_id} chain={chain_id:?} method={method} is not tracked", ); return; }; - if subscription_state.sender.send(result).is_ok() { - // Nothing else to do, user is informed about the notification. - return; - } - - // User dropped the receiver, unsubscribe from the method and remove internal tracking. - let Some(subscription_state) = chain_data.subscriptions.remove(&id) else { - // State is checked to be some above, so this should never happen. - return; - }; - // Make a call to unsubscribe from this method. - let unsub_id = chain_data.next_id(); - let request = format!( - r#"{{"jsonrpc":"2.0","id":"{}", "method":"{}","params":["{}"]}}"#, - unsub_id, subscription_state.unsubscribe_method, id - ); - - if let Err(err) = self.client.json_rpc_request(request, chain_id) { - tracing::warn!( - target: LOG_TARGET, - "Failed to unsubscribe id={id:?} chain={chain_id:?} method={:?} err={err:?}", subscription_state.unsubscribe_method - ); - } else { - tracing::debug!(target: LOG_TARGET,"Unsubscribe id={id:?} chain={chain_id:?} method={:?}", subscription_state.unsubscribe_method); + if active_subscription + .notification_sender + .send(Err(JsonRpcError(error))) + .is_err() + { + self.unsubscribe(&subscription_id, chain_id); } } Err(err) => { @@ -384,169 +492,28 @@ impl BackgroundTask { } } - /// Perform the main background task: - /// - receiving requests from subxt RPC method / subscriptions - /// - provides the results from the light client back to users. - pub async fn start_task( - &mut self, - from_subxt: mpsc::UnboundedReceiver, - from_node: Vec, - ) { - let from_subxt_event = tokio_stream::wrappers::UnboundedReceiverStream::new(from_subxt); + // Unsubscribe from a subscription. + fn unsubscribe(&mut self, subscription_id: &str, chain_id: smoldot_light::ChainId) { + let Some(active_subscription) = self.subscriptions.remove(subscription_id) else { + // Subscription doesn't exist so nothing more to do. + return; + }; - let from_node = from_node.into_iter().map(|rpc| { - Box::pin(futures::stream::unfold(rpc, |mut rpc| async move { - let response = rpc.rpc_responses.next().await; - Some(((response, rpc.chain_id), rpc)) - })) - }); - let stream_combinator = futures::stream::select_all(from_node); + // Build a call to unsubscribe from this method. + let unsub_id = self.next_id(); + let request = format!( + r#"{{"jsonrpc":"2.0","id":"{}", "method":"{}","params":["{}"]}}"#, + unsub_id, active_subscription.unsubscribe_method, subscription_id + ); - tokio::pin!(from_subxt_event, stream_combinator); - - let mut from_subxt_event_fut = from_subxt_event.next(); - let mut from_node_event_fut = stream_combinator.next(); - - loop { - match future::select(from_subxt_event_fut, from_node_event_fut).await { - // Message received from subxt. - Either::Left((subxt_message, previous_fut)) => { - let Some(message) = subxt_message else { - tracing::trace!(target: LOG_TARGET, "Subxt channel closed"); - break; - }; - tracing::trace!( - target: LOG_TARGET, - "Received register message {:?}", - message - ); - - self.handle_requests(message).await; - - from_subxt_event_fut = from_subxt_event.next(); - from_node_event_fut = previous_fut; - } - // Message received from rpc handler: lightclient response. - Either::Right((node_message, previous_fut)) => { - let Some((node_message, chain)) = node_message else { - tracing::trace!(target: LOG_TARGET, "Smoldot closed all RPC channels"); - break; - }; - // Smoldot returns `None` if the chain has been removed (which subxt does not remove). - let Some(response) = node_message else { - tracing::trace!(target: LOG_TARGET, "Smoldot RPC responses channel closed"); - break; - }; - tracing::trace!( - target: LOG_TARGET, - "Received smoldot RPC chain {:?} result {:?}", - chain, response - ); - - self.handle_rpc_response(chain, response); - - // Advance backend, save frontend. - from_subxt_event_fut = previous_fut; - from_node_event_fut = stream_combinator.next(); - } - } + // Submit it. + if let Err(err) = self.client.json_rpc_request(request, chain_id) { + tracing::warn!( + target: LOG_TARGET, + "Failed to unsubscribe id={subscription_id} chain={chain_id:?} method={:?} err={err:?}", active_subscription.unsubscribe_method + ); + } else { + tracing::debug!(target: LOG_TARGET,"Unsubscribe id={subscription_id} chain={chain_id:?} method={:?}", active_subscription.unsubscribe_method); } - - tracing::trace!(target: LOG_TARGET, "Task closed"); - } -} - -/// The RPC response from the light-client. -/// This can either be a response of a method, or a notification from a subscription. -#[derive(Debug, Clone)] -enum RpcResponse { - Method { - /// Response ID. - id: String, - /// The result of the method call. - result: Box, - }, - Subscription { - /// RPC method that generated the notification. - method: String, - /// Subscription ID. - id: String, - /// Result. - result: Box, - }, - Error { - /// Response ID. - id: String, - /// Error. - error: Box, - }, -} - -impl std::str::FromStr for RpcResponse { - type Err = serde_json::Error; - - fn from_str(response: &str) -> Result { - // Helper structures to deserialize from raw RPC strings. - #[derive(Deserialize, Debug)] - struct Response { - /// JSON-RPC version. - #[allow(unused)] - jsonrpc: String, - /// Result. - result: Box, - /// Request ID - id: String, - } - #[derive(Deserialize)] - struct NotificationParams { - /// The ID of the subscription. - subscription: String, - /// Result. - result: Box, - } - #[derive(Deserialize)] - struct ResponseNotification { - /// JSON-RPC version. - #[allow(unused)] - jsonrpc: String, - /// RPC method that generated the notification. - method: String, - /// Result. - params: NotificationParams, - } - #[derive(Deserialize)] - struct ErrorResponse { - /// JSON-RPC version. - #[allow(unused)] - jsonrpc: String, - /// Request ID. - id: String, - /// Error. - error: Box, - } - - // Check if the response can be mapped as an RPC method response. - let result: Result = serde_json::from_str(response); - if let Ok(response) = result { - return Ok(RpcResponse::Method { - id: response.id, - result: response.result, - }); - } - - let result: Result = serde_json::from_str(response); - if let Ok(notification) = result { - return Ok(RpcResponse::Subscription { - id: notification.params.subscription, - method: notification.method, - result: notification.params.result, - }); - } - - let error: ErrorResponse = serde_json::from_str(response)?; - Ok(RpcResponse::Error { - id: error.id, - error: error.error, - }) } } diff --git a/lightclient/src/chain_config.rs b/lightclient/src/chain_config.rs new file mode 100644 index 0000000000..66d5294476 --- /dev/null +++ b/lightclient/src/chain_config.rs @@ -0,0 +1,71 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + +use serde_json::Value; +use std::borrow::Cow; + +/// Something went wrong building chain config. +#[non_exhaustive] +#[derive(thiserror::Error, Debug)] +pub enum ChainConfigError { + /// The provided chain spec is the wrong shape. + #[error("Invalid chain spec format")] + InvalidSpecFormat, +} + +/// Configuration to connect to a chain. +pub struct ChainConfig<'a> { + // The chain spec to use. + chain_spec: Cow<'a, str>, +} + +impl<'a> From<&'a str> for ChainConfig<'a> { + fn from(chain_spec: &'a str) -> Self { + ChainConfig::chain_spec(chain_spec) + } +} + +impl<'a> From for ChainConfig<'a> { + fn from(chain_spec: String) -> Self { + ChainConfig::chain_spec(chain_spec) + } +} + +impl<'a> ChainConfig<'a> { + /// Construct a chain config from a chain spec. + pub fn chain_spec(chain_spec: impl Into>) -> Self { + ChainConfig { + chain_spec: chain_spec.into(), + } + } + + /// Set the bootnodes to the given ones. + pub fn set_bootnodes>( + self, + bootnodes: impl IntoIterator, + ) -> Result { + let mut chain_spec_json: Value = serde_json::from_str(&self.chain_spec) + .map_err(|_e| ChainConfigError::InvalidSpecFormat)?; + + if let Value::Object(map) = &mut chain_spec_json { + let bootnodes = bootnodes + .into_iter() + .map(|s| Value::String(s.as_ref().to_owned())) + .collect(); + + map.insert("bootNodes".to_string(), Value::Array(bootnodes)); + } else { + return Err(ChainConfigError::InvalidSpecFormat); + } + + Ok(ChainConfig { + chain_spec: Cow::Owned(chain_spec_json.to_string()), + }) + } + + // Used internally to fetch the chain spec back out. + pub(crate) fn as_chain_spec(&self) -> &str { + &self.chain_spec + } +} diff --git a/lightclient/src/client.rs b/lightclient/src/client.rs deleted file mode 100644 index f06c968b66..0000000000 --- a/lightclient/src/client.rs +++ /dev/null @@ -1,212 +0,0 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. -// This file is dual-licensed as Apache-2.0 or GPL-3.0. -// see LICENSE for license details. -use std::iter; - -use super::{ - background::{BackgroundTask, FromSubxt, MethodResponse}, - LightClientRpcError, -}; -use serde_json::value::RawValue; -use tokio::sync::{mpsc, mpsc::error::SendError, oneshot}; - -use super::platform::build_platform; - -pub const LOG_TARGET: &str = "subxt-light-client"; - -/// A raw light-client RPC implementation that can connect to multiple chains. -#[derive(Clone)] -pub struct RawLightClientRpc { - /// Communicate with the backend task that multiplexes the responses - /// back to the frontend. - to_backend: mpsc::UnboundedSender, -} - -impl RawLightClientRpc { - /// Construct a [`LightClientRpc`] that can communicated with the provided chain. - /// - /// # Note - /// - /// This uses the same underlying instance created by [`LightClientRpc::new_from_client`]. - pub fn for_chain(&self, chain_id: smoldot_light::ChainId) -> LightClientRpc { - LightClientRpc { - to_backend: self.to_backend.clone(), - chain_id, - } - } -} - -/// The light-client RPC implementation that is used to connect with the chain. -#[derive(Clone)] -pub struct LightClientRpc { - /// Communicate with the backend task that multiplexes the responses - /// back to the frontend. - to_backend: mpsc::UnboundedSender, - /// The chain ID to target for requests. - chain_id: smoldot_light::ChainId, -} - -impl LightClientRpc { - /// Constructs a new [`LightClientRpc`], providing the chain specification. - /// - /// The chain specification can be downloaded from a trusted network via - /// the `sync_state_genSyncSpec` RPC method. This parameter expects the - /// chain spec in text format (ie not in hex-encoded scale-encoded as RPC methods - /// will provide). - /// - /// ## Panics - /// - /// The panic behaviour depends on the feature flag being used: - /// - /// ### Native - /// - /// Panics when called outside of a `tokio` runtime context. - /// - /// ### Web - /// - /// If smoldot panics, then the promise created will be leaked. For more details, see - /// https://docs.rs/wasm-bindgen-futures/latest/wasm_bindgen_futures/fn.future_to_promise.html. - pub fn new( - config: smoldot_light::AddChainConfig< - '_, - (), - impl IntoIterator, - >, - ) -> Result { - tracing::trace!(target: LOG_TARGET, "Create light client"); - - let mut client = smoldot_light::Client::new(build_platform()); - - let config = smoldot_light::AddChainConfig { - specification: config.specification, - json_rpc: config.json_rpc, - database_content: config.database_content, - potential_relay_chains: config.potential_relay_chains.into_iter(), - user_data: config.user_data, - }; - - let smoldot_light::AddChainSuccess { - chain_id, - json_rpc_responses, - } = client - .add_chain(config) - .map_err(|err| LightClientRpcError::AddChainError(err.to_string()))?; - - let rpc_responses = json_rpc_responses.expect("Light client RPC configured; qed"); - - let raw_client = Self::new_from_client( - client, - iter::once(AddedChain { - chain_id, - rpc_responses, - }), - ); - Ok(raw_client.for_chain(chain_id)) - } - - /// Constructs a new [`RawLightClientRpc`] from the raw smoldot client. - /// - /// Receives a list of RPC objects as a result of calling `smoldot_light::Client::add_chain`. - /// This [`RawLightClientRpc`] can target different chains using [`RawLightClientRpc::for_chain`] method. - /// - /// ## Panics - /// - /// The panic behaviour depends on the feature flag being used: - /// - /// ### Native - /// - /// Panics when called outside of a `tokio` runtime context. - /// - /// ### Web - /// - /// If smoldot panics, then the promise created will be leaked. For more details, see - /// https://docs.rs/wasm-bindgen-futures/latest/wasm_bindgen_futures/fn.future_to_promise.html. - pub fn new_from_client( - client: smoldot_light::Client, - chains: impl IntoIterator, - ) -> RawLightClientRpc - where - TPlat: smoldot_light::platform::PlatformRef + Clone, - { - let (to_backend, backend) = mpsc::unbounded_channel(); - let chains = chains.into_iter().collect(); - - let future = async move { - let mut task = BackgroundTask::new(client); - task.start_task(backend, chains).await; - }; - - #[cfg(feature = "native")] - tokio::spawn(future); - #[cfg(feature = "web")] - wasm_bindgen_futures::spawn_local(future); - - RawLightClientRpc { to_backend } - } - - /// Returns the chain ID of the current light-client. - pub fn chain_id(&self) -> smoldot_light::ChainId { - self.chain_id - } - - /// Submits an RPC method request to the light-client. - /// - /// This method sends a request to the light-client to execute an RPC method with the provided parameters. - /// The parameters are parsed into a valid JSON object in the background. - pub fn method_request( - &self, - method: String, - params: String, - ) -> Result, SendError> { - let (sender, receiver) = oneshot::channel(); - - self.to_backend.send(FromSubxt::Request { - method, - params, - sender, - chain_id: self.chain_id, - })?; - - Ok(receiver) - } - - /// Makes an RPC subscription call to the light-client. - /// - /// This method sends a request to the light-client to establish an RPC subscription with the provided parameters. - /// The parameters are parsed into a valid JSON object in the background. - #[allow(clippy::type_complexity)] - pub fn subscription_request( - &self, - method: String, - params: String, - unsubscribe_method: String, - ) -> Result< - ( - oneshot::Receiver, - mpsc::UnboundedReceiver>, - ), - SendError, - > { - let (sub_id, sub_id_rx) = oneshot::channel(); - let (sender, receiver) = mpsc::unbounded_channel(); - - self.to_backend.send(FromSubxt::Subscription { - method, - unsubscribe_method, - params, - sub_id, - sender, - chain_id: self.chain_id, - })?; - - Ok((sub_id_rx, receiver)) - } -} - -/// The added chain of the light-client. -pub struct AddedChain { - /// The id of the chain. - pub chain_id: smoldot_light::ChainId, - /// Producer of RPC responses for the chain. - pub rpc_responses: smoldot_light::JsonRpcResponses, -} diff --git a/lightclient/src/lib.rs b/lightclient/src/lib.rs index 34800fe4f0..6df5c2ec47 100644 --- a/lightclient/src/lib.rs +++ b/lightclient/src/lib.rs @@ -2,52 +2,259 @@ // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. -//! Low level light client implementation for RPC method and -//! subscriptions requests. -//! -//! The client implementation supports both native and wasm -//! environments. -//! -//! This leverages the smoldot crate to connect to the chain. +//! A wrapper around [`smoldot_light`] which provides an light client capable of connecting +//! to Substrate based chains. +#![deny(missing_docs)] #![cfg_attr(docsrs, feature(doc_cfg))] #[cfg(any( all(feature = "web", feature = "native"), not(any(feature = "web", feature = "native")) ))] -compile_error!("subxt: exactly one of the 'web' and 'native' features should be used."); +compile_error!("subxt-lightclient: exactly one of the 'web' and 'native' features should be used."); -mod background; -mod client; mod platform; +mod shared_client; +// mod receiver; +mod background; +mod chain_config; +mod rpc; -// Used to enable the js feature for wasm. -#[cfg(feature = "web")] -#[allow(unused_imports)] -pub use getrandom as _; +use background::{BackgroundTask, BackgroundTaskHandle}; +use futures::Stream; +use platform::DefaultPlatform; +use serde_json::value::RawValue; +use shared_client::SharedClient; +use std::future::Future; +use tokio::sync::mpsc; -pub use client::{AddedChain, LightClientRpc, RawLightClientRpc}; +pub use chain_config::{ChainConfig, ChainConfigError}; -/// Re-exports of the smoldot related objects. -pub mod smoldot { - pub use smoldot_light::{ - platform::PlatformRef, AddChainConfig, AddChainConfigJsonRpc, ChainId, Client, - JsonRpcResponses, - }; - - #[cfg(feature = "native")] - #[cfg_attr(docsrs, doc(cfg(feature = "native")))] - pub use smoldot_light::platform::default::DefaultPlatform; -} - -/// Light client error. +/// Things that can go wrong when constructing the [`LightClient`]. #[derive(Debug, thiserror::Error)] -pub enum LightClientRpcError { +pub enum LightClientError { /// Error encountered while adding the chain to the light-client. #[error("Failed to add the chain to the light client: {0}.")] AddChainError(String), - /// Error originated while trying to submit a RPC request. - #[error("RPC request cannot be sent: {0}.")] - Request(String), +} + +/// Things that can go wrong calling methods of [`LightClientRpc`]. +#[derive(Debug, thiserror::Error)] +pub enum LightClientRpcError { + /// Error response from the JSON-RPC server. + #[error("{0}")] + JsonRpcError(JsonRpcError), + /// Smoldot could not handle the RPC call. + #[error("Smoldot could not handle the RPC call: {0}.")] + SmoldotError(String), + /// Background task dropped. + #[error("The background task was dropped.")] + BackgroundTaskDropped, +} + +/// An error response from the JSON-RPC server (ie smoldot) in response to +/// a method call or as a subscription notification. +#[derive(Debug, thiserror::Error)] +#[error("RPC Error: {0}.")] +pub struct JsonRpcError(Box); + +/// This represents a single light client connection to the network. Instantiate +/// it with [`LightClient::relay_chain()`] to communicate with a relay chain, and +/// then call [`LightClient::parachain()`] to establish connections to parachains. +#[derive(Clone)] +pub struct LightClient { + client: SharedClient, + relay_chain_id: smoldot_light::ChainId, +} + +impl LightClient { + /// Given a chain spec, establish a connection to a relay chain. Any subsequent calls to + /// [`LightClient::parachain()`] will set this as the relay chain. + /// + /// # Panics + /// + /// The panic behaviour depends on the feature flag being used: + /// + /// ## Native + /// + /// Panics when called outside of a `tokio` runtime context. + /// + /// ## Web + /// + /// If smoldot panics, then the promise created will be leaked. For more details, see + /// https://docs.rs/wasm-bindgen-futures/latest/wasm_bindgen_futures/fn.future_to_promise.html. + pub fn relay_chain<'a>( + chain_config: impl Into>, + ) -> Result<(Self, LightClientRpc), LightClientError> { + let mut client = smoldot_light::Client::new(platform::build_platform()); + let chain_config = chain_config.into(); + let chain_spec = chain_config.as_chain_spec(); + + let config = smoldot_light::AddChainConfig { + specification: chain_spec, + json_rpc: smoldot_light::AddChainConfigJsonRpc::Enabled { + max_pending_requests: u32::MAX.try_into().unwrap(), + max_subscriptions: u32::MAX, + }, + database_content: "", + potential_relay_chains: std::iter::empty(), + user_data: (), + }; + + let added_chain = client + .add_chain(config) + .map_err(|err| LightClientError::AddChainError(err.to_string()))?; + + let relay_chain_id = added_chain.chain_id; + let rpc_responses = added_chain + .json_rpc_responses + .expect("Light client RPC configured; qed"); + let shared_client: SharedClient<_> = client.into(); + + let light_client_rpc = + LightClientRpc::new_raw(shared_client.clone(), relay_chain_id, rpc_responses); + let light_client = Self { + client: shared_client, + relay_chain_id, + }; + + Ok((light_client, light_client_rpc)) + } + + /// Given a chain spec, establish a connection to a parachain. + /// + /// # Panics + /// + /// The panic behaviour depends on the feature flag being used: + /// + /// ## Native + /// + /// Panics when called outside of a `tokio` runtime context. + /// + /// ## Web + /// + /// If smoldot panics, then the promise created will be leaked. For more details, see + /// https://docs.rs/wasm-bindgen-futures/latest/wasm_bindgen_futures/fn.future_to_promise.html. + pub fn parachain<'a>( + &self, + chain_config: impl Into>, + ) -> Result { + let chain_config = chain_config.into(); + let chain_spec = chain_config.as_chain_spec(); + + let config = smoldot_light::AddChainConfig { + specification: chain_spec, + json_rpc: smoldot_light::AddChainConfigJsonRpc::Enabled { + max_pending_requests: u32::MAX.try_into().unwrap(), + max_subscriptions: u32::MAX, + }, + database_content: "", + potential_relay_chains: std::iter::once(self.relay_chain_id), + user_data: (), + }; + + let added_chain = self + .client + .add_chain(config) + .map_err(|err| LightClientError::AddChainError(err.to_string()))?; + + let chain_id = added_chain.chain_id; + let rpc_responses = added_chain + .json_rpc_responses + .expect("Light client RPC configured; qed"); + + Ok(LightClientRpc::new_raw( + self.client.clone(), + chain_id, + rpc_responses, + )) + } +} + +/// This represents a single RPC connection to a specific chain, and is constructed by calling +/// one of the methods on [`LightClient`]. Using this, you can make RPC requests to the chain. +#[derive(Clone, Debug)] +pub struct LightClientRpc { + handle: BackgroundTaskHandle, +} + +impl LightClientRpc { + // Dev note: this would provide a "low leveL" interface if one is needed. + // Do we actually need to provide this, or can we entirely hide Smoldot? + pub(crate) fn new_raw( + client: impl Into>, + chain_id: smoldot_light::ChainId, + rpc_responses: smoldot_light::JsonRpcResponses, + ) -> Self + where + TPlat: smoldot_light::platform::PlatformRef + Send + 'static, + TChain: Send + 'static, + { + let (background_task, background_handle) = + BackgroundTask::new(client.into(), chain_id, rpc_responses); + + // For now we spawn the background task internally, but later we can expose + // methods to give this back to the user so that they can exert backpressure. + spawn(async move { background_task.run().await }); + + LightClientRpc { + handle: background_handle, + } + } + + /// Make an RPC request to a chain, getting back a result. + pub async fn request( + &self, + method: String, + params: Option>, + ) -> Result, LightClientRpcError> { + self.handle.request(method, params).await + } + + /// Subscribe to some RPC method, getting back a stream of notifications. + pub async fn subscribe( + &self, + method: String, + params: Option>, + unsub: String, + ) -> Result { + let (id, notifications) = self.handle.subscribe(method, params, unsub).await?; + Ok(LightClientRpcSubscription { id, notifications }) + } +} + +/// A stream of notifications handed back when [`LightClientRpc::subscribe`] is called. +pub struct LightClientRpcSubscription { + notifications: mpsc::UnboundedReceiver, JsonRpcError>>, + id: String, +} + +impl LightClientRpcSubscription { + /// Return the subscription ID + pub fn id(&self) -> &str { + &self.id + } +} + +impl Stream for LightClientRpcSubscription { + type Item = Result, JsonRpcError>; + fn poll_next( + mut self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.notifications.poll_recv(cx) + } +} + +/// A quick helper to spawn a task that works for WASM. +fn spawn(future: F) { + #[cfg(feature = "native")] + tokio::spawn(async move { + future.await; + }); + #[cfg(feature = "web")] + wasm_bindgen_futures::spawn_local(async move { + future.await; + }); } diff --git a/lightclient/src/platform/mod.rs b/lightclient/src/platform/mod.rs index 7a1182da66..34cb1b26f8 100644 --- a/lightclient/src/platform/mod.rs +++ b/lightclient/src/platform/mod.rs @@ -11,16 +11,16 @@ mod wasm_platform; #[cfg(feature = "web")] mod wasm_socket; -pub use helpers::build_platform; +pub use helpers::{build_platform, DefaultPlatform}; #[cfg(feature = "native")] mod helpers { use smoldot_light::platform::default::DefaultPlatform as Platform; use std::sync::Arc; - pub type PlatformType = Arc; + pub type DefaultPlatform = Arc; - pub fn build_platform() -> PlatformType { + pub fn build_platform() -> DefaultPlatform { Platform::new( "subxt-light-client".into(), env!("CARGO_PKG_VERSION").into(), @@ -32,9 +32,9 @@ mod helpers { mod helpers { use super::wasm_platform::SubxtPlatform as Platform; - pub type PlatformType = Platform; + pub type DefaultPlatform = Platform; - pub fn build_platform() -> PlatformType { + pub fn build_platform() -> DefaultPlatform { Platform::new() } } diff --git a/lightclient/src/rpc.rs b/lightclient/src/rpc.rs new file mode 100644 index 0000000000..6d84837020 --- /dev/null +++ b/lightclient/src/rpc.rs @@ -0,0 +1,132 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + +use serde::Deserialize; +use serde_json::value::RawValue; + +/// The RPC response from the light-client. +/// This can either be a response of a method, or a notification from a subscription. +#[derive(Debug, Clone)] +pub enum RpcResponse { + Method { + /// Response ID. + id: String, + /// The result of the method call. + result: Box, + }, + MethodError { + /// Response ID. + id: String, + /// Error. + error: Box, + }, + Notification { + /// RPC method that generated the notification. + method: String, + /// Subscription ID. + subscription_id: String, + /// Result. + result: Box, + }, + NotificationError { + /// RPC method that generated the notification. + method: String, + /// Subscription ID. + subscription_id: String, + /// Result. + error: Box, + }, +} + +impl std::str::FromStr for RpcResponse { + type Err = (); + + fn from_str(response: &str) -> Result { + // Valid response + #[derive(Deserialize, Debug)] + struct Response { + #[allow(unused)] + jsonrpc: String, + id: String, + result: Box, + } + + // Error response + #[derive(Deserialize)] + struct ResponseError { + #[allow(unused)] + jsonrpc: String, + id: String, + error: Box, + } + + // Valid notification (subscription) response + #[derive(Deserialize)] + struct Notification { + #[allow(unused)] + jsonrpc: String, + method: String, + params: NotificationResultParams, + } + #[derive(Deserialize)] + struct NotificationResultParams { + subscription: String, + result: Box, + } + + // Error notification (subscription) response + #[derive(Deserialize)] + struct NotificationError { + #[allow(unused)] + jsonrpc: String, + method: String, + params: NotificationErrorParams, + } + #[derive(Deserialize)] + struct NotificationErrorParams { + /// The ID of the subscription. + subscription: String, + error: Box, + } + + // Try deserializing the response payload to one of the above. We can + // do this more efficiently eg how jsonrpsee_types does. + + let result: Result = serde_json::from_str(response); + if let Ok(response) = result { + return Ok(RpcResponse::Method { + id: response.id, + result: response.result, + }); + } + let result: Result = serde_json::from_str(response); + if let Ok(response) = result { + return Ok(RpcResponse::Notification { + subscription_id: response.params.subscription, + method: response.method, + result: response.params.result, + }); + } + let result: Result = serde_json::from_str(response); + if let Ok(response) = result { + return Ok(RpcResponse::MethodError { + id: response.id, + error: response.error, + }); + } + let result: Result = serde_json::from_str(response); + if let Ok(response) = result { + return Ok(RpcResponse::NotificationError { + method: response.method, + subscription_id: response.params.subscription, + error: response.params.error, + }); + } + + // We couldn't decode into any of the above. We could pick one of the above` + // errors to return, but there's no real point since the string is obviously + // different from any of them. + Err(()) + } +} diff --git a/lightclient/src/shared_client.rs b/lightclient/src/shared_client.rs new file mode 100644 index 0000000000..d725030599 --- /dev/null +++ b/lightclient/src/shared_client.rs @@ -0,0 +1,47 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + +use smoldot_light as sl; +use std::sync::{Arc, Mutex}; + +/// This wraps [`smoldot_light::Client`] so that it can be cloned and shared. +#[derive(Clone)] +pub struct SharedClient { + client: Arc>>, +} + +impl From> + for SharedClient +{ + fn from(client: sl::Client) -> Self { + SharedClient { + client: Arc::new(Mutex::new(client)), + } + } +} + +impl SharedClient { + /// Delegates to [`smoldot_light::Client::json_rpc_request()`]. + pub(crate) fn json_rpc_request( + &self, + json_rpc_request: impl Into, + chain_id: sl::ChainId, + ) -> Result<(), sl::HandleRpcError> { + self.client + .lock() + .expect("mutex should not be poisoned") + .json_rpc_request(json_rpc_request, chain_id) + } + + /// Delegates to [`smoldot_light::Client::add_chain()`]. + pub(crate) fn add_chain( + &self, + config: sl::AddChainConfig<'_, TChain, impl Iterator>, + ) -> Result { + self.client + .lock() + .expect("mutex should not be poisoned") + .add_chain(config) + } +} diff --git a/metadata/Cargo.toml b/metadata/Cargo.toml index a6e15de0aa..1423122ed5 100644 --- a/metadata/Cargo.toml +++ b/metadata/Cargo.toml @@ -21,7 +21,7 @@ std = ["scale-info/std", "frame-metadata/std"] scale-info = { workspace = true, default-features = false } frame-metadata = { workspace = true, default-features = false, features = ["current", "decode"] } codec = { package = "parity-scale-codec", workspace = true, default-features = false, features = ["derive"] } -sp-core-hashing = { workspace = true } +sp-crypto-hashing = { workspace = true } hashbrown = { workspace = true } derive_more = { workspace = true } diff --git a/metadata/src/from_into/v14.rs b/metadata/src/from_into/v14.rs index b9b13cf681..989542ab56 100644 --- a/metadata/src/from_into/v14.rs +++ b/metadata/src/from_into/v14.rs @@ -316,9 +316,7 @@ fn generate_outer_enums( ) -> Result, TryFromError> { let find_type = |name: &str| { metadata.types.types.iter().find_map(|ty| { - let Some(ident) = ty.ty.path.ident() else { - return None; - }; + let ident = ty.ty.path.ident()?; if ident != name { return None; @@ -368,9 +366,7 @@ fn generate_outer_error_enum_type( .pallets .iter() .filter_map(|pallet| { - let Some(error) = &pallet.error else { - return None; - }; + let error = pallet.error.as_ref()?; // Note: using the `alloc::format!` macro like in `let path = format!("{}Error", pallet.name);` // leads to linker errors about extern function `_Unwind_Resume` not being defined. diff --git a/metadata/src/lib.rs b/metadata/src/lib.rs index 59a3ba484b..2f3c6c0000 100644 --- a/metadata/src/lib.rs +++ b/metadata/src/lib.rs @@ -475,6 +475,35 @@ pub enum StorageHasher { Identity, } +impl StorageHasher { + /// The hash produced by a [`StorageHasher`] can have these two components, in order: + /// + /// 1. A fixed size hash. (not present for [`StorageHasher::Identity`]). + /// 2. The SCALE encoded key that was used as an input to the hasher (only present for + /// [`StorageHasher::Twox64Concat`], [`StorageHasher::Blake2_128Concat`] or [`StorageHasher::Identity`]). + /// + /// This function returns the number of bytes used to represent the first of these. + pub fn len_excluding_key(&self) -> usize { + match self { + StorageHasher::Blake2_128Concat => 16, + StorageHasher::Twox64Concat => 8, + StorageHasher::Blake2_128 => 16, + StorageHasher::Blake2_256 => 32, + StorageHasher::Twox128 => 16, + StorageHasher::Twox256 => 32, + StorageHasher::Identity => 0, + } + } + + /// Returns true if the key used to produce the hash is appended to the hash itself. + pub fn ends_with_key(&self) -> bool { + matches!( + self, + StorageHasher::Blake2_128Concat | StorageHasher::Twox64Concat | StorageHasher::Identity + ) + } +} + /// Is the storage entry optional, or does it have a default value. #[derive(Debug, Clone, Copy, Eq, PartialEq)] pub enum StorageEntryModifier { diff --git a/metadata/src/utils/validation.rs b/metadata/src/utils/validation.rs index 2b1b1f5e33..dfa4f9b829 100644 --- a/metadata/src/utils/validation.rs +++ b/metadata/src/utils/validation.rs @@ -35,7 +35,7 @@ enum TypeBeingHashed { /// Hashing function utilized internally. fn hash(data: &[u8]) -> Hash { - sp_core_hashing::twox_256(data) + sp_crypto_hashing::twox_256(data) } /// XOR two hashes together. Only use this when you don't care about the order diff --git a/signer/Cargo.toml b/signer/Cargo.toml index 226237c315..7e307b2284 100644 --- a/signer/Cargo.toml +++ b/signer/Cargo.toml @@ -15,7 +15,8 @@ description = "Sign extrinsics to be submitted by Subxt" keywords = ["parity", "subxt", "extrinsic", "signer"] [features] -default = ["sr25519", "ecdsa", "subxt", "native"] +default = ["sr25519", "ecdsa", "subxt", "std", "native"] +std = ["regex/std", "sp-crypto-hashing/std", "pbkdf2/std", "sha2/std", "hmac/std", "bip39/std", "schnorrkel/std", "secp256k1/std", "sp-core/std"] # Pick the signer implementation(s) you need by enabling the # corresponding features. Note: I had more difficulties getting @@ -34,26 +35,28 @@ web = ["getrandom/js", "subxt?/web"] native = ["subxt?/native"] [dependencies] -subxt = { workspace = true, optional = true, default-features = false } -regex = { workspace = true } +subxt = { workspace = true, optional = true } +regex = { workspace = true, features = ["unicode"] } hex = { workspace = true } +cfg-if = { workspace = true } codec = { package = "parity-scale-codec", workspace = true, features = ["derive"] } -sp-core-hashing = { workspace = true } -thiserror = { workspace = true } +sp-crypto-hashing = { workspace = true } +derive_more = { workspace = true } pbkdf2 = { workspace = true } sha2 = { workspace = true } hmac = { workspace = true } zeroize = { workspace = true } bip39 = { workspace = true } schnorrkel = { workspace = true, optional = true } -secp256k1 = { workspace = true, features = ["recovery", "global-context"], optional = true } +secp256k1 = { workspace = true, optional = true, features = ["alloc", "recovery"] } secrecy = { workspace = true } + # We only pull this in to enable the JS flag for schnorrkel to use. getrandom = { workspace = true, optional = true } [dev-dependencies] -sp-core = { workspace = true, features = ["std"] } +sp-core = { workspace = true } sp-keyring = { workspace = true } [package.metadata.cargo-machete] diff --git a/signer/src/crypto/derive_junction.rs b/signer/src/crypto/derive_junction.rs index 87beee1717..b68f079986 100644 --- a/signer/src/crypto/derive_junction.rs +++ b/signer/src/crypto/derive_junction.rs @@ -40,7 +40,7 @@ impl DeriveJunction { let mut cc: [u8; JUNCTION_ID_LEN] = Default::default(); index.using_encoded(|data| { if data.len() > JUNCTION_ID_LEN { - cc.copy_from_slice(&sp_core_hashing::blake2_256(data)); + cc.copy_from_slice(&sp_crypto_hashing::blake2_256(data)); } else { cc[0..data.len()].copy_from_slice(data); } diff --git a/signer/src/crypto/mod.rs b/signer/src/crypto/mod.rs index c47dfe08a6..5ccdb3df79 100644 --- a/signer/src/crypto/mod.rs +++ b/signer/src/crypto/mod.rs @@ -6,8 +6,13 @@ mod derive_junction; mod secret_uri; + +// No need for the cfg other than to avoid an unused_imports lint warning. +#[cfg(any(feature = "sr25519", feature = "ecdsa"))] mod seed_from_entropy; pub use derive_junction::DeriveJunction; pub use secret_uri::{SecretUri, SecretUriError, DEV_PHRASE}; + +#[cfg(any(feature = "sr25519", feature = "ecdsa"))] pub use seed_from_entropy::seed_from_entropy; diff --git a/signer/src/crypto/secret_uri.rs b/signer/src/crypto/secret_uri.rs index 7be43b8286..5148311795 100644 --- a/signer/src/crypto/secret_uri.rs +++ b/signer/src/crypto/secret_uri.rs @@ -3,6 +3,8 @@ // see LICENSE for license details. use super::DeriveJunction; +use alloc::vec::Vec; +use derive_more::Display; use regex::Regex; use secrecy::SecretString; @@ -88,7 +90,7 @@ pub struct SecretUri { pub junctions: Vec, } -impl std::str::FromStr for SecretUri { +impl core::str::FromStr for SecretUri { type Err = SecretUriError; fn from_str(s: &str) -> Result { @@ -115,14 +117,17 @@ impl std::str::FromStr for SecretUri { } /// This is returned if `FromStr` cannot parse a string into a `SecretUri`. -#[derive(Debug, Copy, Clone, PartialEq, thiserror::Error)] +#[derive(Debug, Copy, Clone, PartialEq, Display)] pub enum SecretUriError { /// Parsing the secret URI from a string failed; wrong format. - #[error("Invalid secret phrase format")] + #[display(fmt = "Invalid secret phrase format")] InvalidFormat, } -once_static! { +#[cfg(feature = "std")] +impl std::error::Error for SecretUriError {} + +once_static_cloned! { /// Interpret a phrase like: /// /// ```text diff --git a/signer/src/crypto/seed_from_entropy.rs b/signer/src/crypto/seed_from_entropy.rs index 7643ff7835..e665c132ab 100644 --- a/signer/src/crypto/seed_from_entropy.rs +++ b/signer/src/crypto/seed_from_entropy.rs @@ -2,6 +2,7 @@ // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. +use alloc::string::String; use hmac::Hmac; use pbkdf2::pbkdf2; use sha2::Sha512; diff --git a/signer/src/ecdsa.rs b/signer/src/ecdsa.rs index a76054abf1..de84d4bd9a 100644 --- a/signer/src/ecdsa.rs +++ b/signer/src/ecdsa.rs @@ -6,8 +6,10 @@ use codec::Encode; use crate::crypto::{seed_from_entropy, DeriveJunction, SecretUri}; +use core::str::FromStr; +use derive_more::{Display, From}; use hex::FromHex; -use secp256k1::{ecdsa::RecoverableSignature, Message, SecretKey, SECP256K1}; +use secp256k1::{ecdsa::RecoverableSignature, Message, Secp256k1, SecretKey}; use secrecy::ExposeSecret; const SEED_LENGTH: usize = 32; @@ -68,7 +70,7 @@ impl Keypair { let seed = Seed::from_hex(hex_str)?; Self::from_seed(seed)? } else { - let phrase = bip39::Mnemonic::parse(phrase.expose_secret().as_str())?; + let phrase = bip39::Mnemonic::from_str(phrase.expose_secret().as_str())?; let pass_str = password.as_ref().map(|p| p.expose_secret().as_str()); Self::from_phrase(&phrase, pass_str)? }; @@ -91,8 +93,9 @@ impl Keypair { /// keypair.sign(b"Hello world!"); /// ``` pub fn from_phrase(mnemonic: &bip39::Mnemonic, password: Option<&str>) -> Result { - let big_seed = seed_from_entropy(&mnemonic.to_entropy(), password.unwrap_or("")) - .ok_or(Error::InvalidSeed)?; + let (arr, len) = mnemonic.to_entropy_array(); + let big_seed = + seed_from_entropy(&arr[0..len], password.unwrap_or("")).ok_or(Error::InvalidSeed)?; let seed: Seed = big_seed[..SEED_LENGTH] .try_into() @@ -109,7 +112,8 @@ impl Keypair { pub fn from_seed(seed: Seed) -> Result { let secret = SecretKey::from_slice(&seed).map_err(|_| Error::InvalidSeed)?; Ok(Self(secp256k1::Keypair::from_secret_key( - SECP256K1, &secret, + &Secp256k1::signing_only(), + &secret, ))) } @@ -140,7 +144,7 @@ impl Keypair { DeriveJunction::Soft(_) => return Err(Error::SoftJunction), DeriveJunction::Hard(junction_bytes) => { acc = ("Secp256k1HDKD", acc, junction_bytes) - .using_encoded(sp_core_hashing::blake2_256) + .using_encoded(sp_crypto_hashing::blake2_256) } } } @@ -157,13 +161,13 @@ impl Keypair { /// Sign some message. These bytes can be used directly in a Substrate `MultiSignature::Ecdsa(..)`. pub fn sign(&self, message: &[u8]) -> Signature { // From sp_core::ecdsa::sign: - let message_hash = sp_core_hashing::blake2_256(message); + let message_hash = sp_crypto_hashing::blake2_256(message); // From sp_core::ecdsa::sign_prehashed: let wrapped = Message::from_digest_slice(&message_hash).expect("Message is 32 bytes; qed"); let recsig: RecoverableSignature = - SECP256K1.sign_ecdsa_recoverable(&wrapped, &self.0.secret_key()); + Secp256k1::signing_only().sign_ecdsa_recoverable(&wrapped, &self.0.secret_key()); // From sp_core::ecdsa's `impl From for Signature`: - let (recid, sig) = recsig.serialize_compact(); + let (recid, sig): (_, [u8; 64]) = recsig.serialize_compact(); let mut signature_bytes: [u8; 65] = [0; 65]; signature_bytes[..64].copy_from_slice(&sig); signature_bytes[64] = (recid.to_i32() & 0xFF) as u8; @@ -190,33 +194,41 @@ pub fn verify>(sig: &Signature, message: M, pubkey: &PublicKey) - let Ok(public) = secp256k1::PublicKey::from_slice(&pubkey.0) else { return false; }; - let message_hash = sp_core_hashing::blake2_256(message.as_ref()); + let message_hash = sp_crypto_hashing::blake2_256(message.as_ref()); let wrapped = Message::from_digest_slice(&message_hash).expect("Message is 32 bytes; qed"); - signature.verify(&wrapped, &public).is_ok() + + Secp256k1::verification_only() + .verify_ecdsa(&wrapped, &signature, &public) + .is_ok() } /// An error handed back if creating a keypair fails. -#[derive(Debug, PartialEq, thiserror::Error)] +#[derive(Debug, PartialEq, Display, From)] pub enum Error { /// Invalid seed. - #[error("Invalid seed (was it the wrong length?)")] + #[display(fmt = "Invalid seed (was it the wrong length?)")] + #[from(ignore)] InvalidSeed, /// Invalid seed. - #[error("Invalid seed for ECDSA, contained soft junction")] + #[display(fmt = "Invalid seed for ECDSA, contained soft junction")] + #[from(ignore)] SoftJunction, /// Invalid phrase. - #[error("Cannot parse phrase: {0}")] - Phrase(#[from] bip39::Error), + #[display(fmt = "Cannot parse phrase: {_0}")] + Phrase(bip39::Error), /// Invalid hex. - #[error("Cannot parse hex string: {0}")] - Hex(#[from] hex::FromHexError), + #[display(fmt = "Cannot parse hex string: {_0}")] + Hex(hex::FromHexError), } +#[cfg(feature = "std")] +impl std::error::Error for Error {} + /// Dev accounts, helpful for testing but not to be used in production, /// since the secret keys are known. pub mod dev { use super::*; - use std::str::FromStr; + use core::str::FromStr; once_static_cloned! { /// Equivalent to `{DEV_PHRASE}//Alice`. @@ -287,7 +299,7 @@ mod subxt_compat { /// We often want this type, and using this method avoids any /// ambiguous type resolution issues. pub fn to_account_id(self) -> AccountId32 { - AccountId32(sp_core_hashing::blake2_256(&self.0)) + AccountId32(sp_crypto_hashing::blake2_256(&self.0)) } /// A shortcut to obtain a [`MultiAddress`] from a [`PublicKey`]. /// We often want this type, and using this method avoids any diff --git a/signer/src/lib.rs b/signer/src/lib.rs index 2c79d6a1ec..db13732327 100644 --- a/signer/src/lib.rs +++ b/signer/src/lib.rs @@ -14,6 +14,9 @@ //! subxt transactions for chains supporting sr25519 signatures. #![cfg_attr(docsrs, feature(doc_cfg))] +#![cfg_attr(not(feature = "std"), no_std)] + +extern crate alloc; #[macro_use] mod utils; @@ -40,9 +43,3 @@ pub use secrecy::{ExposeSecret, SecretString}; // SecretUri's can be parsed from strings and used to generate key pairs. // DeriveJunctions are the "path" part of these SecretUris. pub use crypto::{DeriveJunction, SecretUri, SecretUriError, DEV_PHRASE}; - -#[cfg(any( - all(feature = "web", feature = "native"), - not(any(feature = "web", feature = "native")) -))] -compile_error!("subxt-signer: exactly one of the 'web' and 'native' features should be used."); diff --git a/signer/src/sr25519.rs b/signer/src/sr25519.rs index 01e6cc84b1..344e7b2655 100644 --- a/signer/src/sr25519.rs +++ b/signer/src/sr25519.rs @@ -4,7 +4,11 @@ //! An sr25519 keypair implementation. +use core::str::FromStr; + use crate::crypto::{seed_from_entropy, DeriveJunction, SecretUri}; + +use derive_more::{Display, From}; use hex::FromHex; use schnorrkel::{ derive::{ChainCode, Derivation}, @@ -72,7 +76,7 @@ impl Keypair { let seed = Seed::from_hex(hex_str)?; Self::from_seed(seed)? } else { - let phrase = bip39::Mnemonic::parse(phrase.expose_secret().as_str())?; + let phrase = bip39::Mnemonic::from_str(phrase.expose_secret().as_str())?; let pass_str = password.as_ref().map(|p| p.expose_secret().as_str()); Self::from_phrase(&phrase, pass_str)? }; @@ -95,8 +99,9 @@ impl Keypair { /// keypair.sign(b"Hello world!"); /// ``` pub fn from_phrase(mnemonic: &bip39::Mnemonic, password: Option<&str>) -> Result { - let big_seed = seed_from_entropy(&mnemonic.to_entropy(), password.unwrap_or("")) - .ok_or(Error::InvalidSeed)?; + let (arr, len) = mnemonic.to_entropy_array(); + let big_seed = + seed_from_entropy(&arr[0..len], password.unwrap_or("")).ok_or(Error::InvalidSeed)?; let seed: Seed = big_seed[..SEED_LENGTH] .try_into() @@ -187,24 +192,28 @@ pub fn verify>(sig: &Signature, message: M, pubkey: &PublicKey) - } /// An error handed back if creating a keypair fails. -#[derive(Debug, thiserror::Error)] +#[derive(Debug, Display, From)] pub enum Error { /// Invalid seed. - #[error("Invalid seed (was it the wrong length?)")] + #[display(fmt = "Invalid seed (was it the wrong length?)")] + #[from(ignore)] InvalidSeed, /// Invalid phrase. - #[error("Cannot parse phrase: {0}")] - Phrase(#[from] bip39::Error), + #[display(fmt = "Cannot parse phrase: {_0}")] + Phrase(bip39::Error), /// Invalid hex. - #[error("Cannot parse hex string: {0}")] - Hex(#[from] hex::FromHexError), + #[display(fmt = "Cannot parse hex string: {_0}")] + Hex(hex::FromHexError), } +#[cfg(feature = "std")] +impl std::error::Error for Error {} + /// Dev accounts, helpful for testing but not to be used in production, /// since the secret keys are known. pub mod dev { use super::*; - use std::str::FromStr; + use core::str::FromStr; once_static_cloned! { /// Equivalent to `{DEV_PHRASE}//Alice`. diff --git a/signer/src/utils.rs b/signer/src/utils.rs index 2e12665419..e3cea3cfc8 100644 --- a/signer/src/utils.rs +++ b/signer/src/utils.rs @@ -7,34 +7,29 @@ /// Use like: /// /// ```rust,ignore -/// once_static!{ +/// once_static_cloned!{ /// /// Some documentation. /// fn foo() -> Vec { /// vec![1,2,3,4] /// } /// } /// ``` -macro_rules! once_static { - ($($(#[$attr:meta])* $vis:vis fn $name:ident() -> $ty:ty { $expr:expr } )+) => { - $( - $(#[$attr])* - $vis fn $name() -> &'static $ty { - static VAR: std::sync::OnceLock<$ty> = std::sync::OnceLock::new(); - VAR.get_or_init(|| { $expr }) - } - )+ - }; -} - -/// Like `once_static!` but clones the item out of static storage. Useful if it +/// +/// Clones the item out of static storage. Useful if it /// takes a while to create the item but cloning it is fairly cheap. macro_rules! once_static_cloned { ($($(#[$attr:meta])* $vis:vis fn $name:ident() -> $ty:ty { $expr:expr } )+) => { $( $(#[$attr])* $vis fn $name() -> $ty { - static VAR: std::sync::OnceLock<$ty> = std::sync::OnceLock::new(); - VAR.get_or_init(|| { $expr }).clone() + cfg_if::cfg_if! { + if #[cfg(feature = "std")] { + static VAR: std::sync::OnceLock<$ty> = std::sync::OnceLock::new(); + VAR.get_or_init(|| { $expr }).clone() + } else { + { $expr } + } + } } )+ }; diff --git a/signer/wasm-tests/Cargo.toml b/signer/wasm-tests/Cargo.toml index 008dc84018..5bf218a4c2 100644 --- a/signer/wasm-tests/Cargo.toml +++ b/signer/wasm-tests/Cargo.toml @@ -8,14 +8,13 @@ publish = false wasm-bindgen-test = "0.3.24" tracing-wasm = "0.2.1" console_error_panic_hook = "0.1.7" -serde_json = "1" # This crate is not a part of the workspace, because we want to # enable the "web" feature here but don't want it enabled as part # of workspace builds. Also disable the "subxt" feature here because # we want to ensure it works in isolation of that. -subxt-signer = { path = "..", default-features = false, features = ["web", "sr25519", "ecdsa"] } +subxt-signer = { path = "..", default-features = false, features = ["web", "sr25519", "ecdsa", "std"] } # this shouldn't be needed, it's in workspace.exclude, but still # I get the complaint unless I add it... -[workspace] \ No newline at end of file +[workspace] diff --git a/subxt/Cargo.toml b/subxt/Cargo.toml index 9b927ed1db..0503f47d29 100644 --- a/subxt/Cargo.toml +++ b/subxt/Cargo.toml @@ -25,20 +25,20 @@ default = ["jsonrpsee", "native"] # Enable this for native (ie non web/wasm builds). # Exactly 1 of "web" and "native" is expected. native = [ - "jsonrpsee?/async-client", - "jsonrpsee?/client-ws-transport-native-tls", - "subxt-lightclient?/native", + "jsonrpsee?/async-client", + "jsonrpsee?/client-ws-transport-native-tls", + "subxt-lightclient?/native", "tokio-util" ] # Enable this for web/wasm builds. # Exactly 1 of "web" and "native" is expected. web = [ - "jsonrpsee?/async-wasm-client", - "jsonrpsee?/client-web-transport", - "getrandom/js", - "subxt-lightclient?/web", - "subxt-macro/web", + "jsonrpsee?/async-wasm-client", + "jsonrpsee?/client-web-transport", + "getrandom/js", + "subxt-lightclient?/web", + "subxt-macro/web", "instant/wasm-bindgen" ] @@ -46,7 +46,9 @@ web = [ unstable-reconnecting-rpc-client = ["dep:reconnecting-jsonrpsee-ws-client"] # Enable this to use jsonrpsee (allowing for example `OnlineClient::from_url`). -jsonrpsee = ["dep:jsonrpsee"] +jsonrpsee = [ + "dep:jsonrpsee", +] # Enable this to pull in extra Substrate dependencies which make it possible to # use the `sp_core::crypto::Pair` Signer implementation, as well as adding some @@ -61,20 +63,20 @@ unstable-metadata = [] # Activate this to expose the Light Client functionality. # Note that this feature is experimental and things may break or not work as expected. -unstable-light-client = ["subxt-lightclient", "tokio-stream"] +unstable-light-client = ["subxt-lightclient"] [dependencies] async-trait = { workspace = true } codec = { package = "parity-scale-codec", workspace = true, features = ["derive"] } -scale-info = { workspace = true } -scale-value = { workspace = true } -scale-bits = { workspace = true } -scale-decode = { workspace = true } -scale-encode = { workspace = true } +scale-info = { workspace = true, features = ["default"] } +scale-value = { workspace = true, features = ["default"] } +scale-bits = { workspace = true, features = ["default"] } +scale-decode = { workspace = true, features = ["default"] } +scale-encode = { workspace = true, features = ["default"] } futures = { workspace = true } hex = { workspace = true } serde = { workspace = true, features = ["derive"] } -serde_json = { workspace = true, features = ["raw_value"] } +serde_json = { workspace = true, features = ["default", "raw_value"] } thiserror = { workspace = true } tracing = { workspace = true } frame-metadata = { workspace = true } @@ -84,8 +86,8 @@ instant = { workspace = true } # Provides some deserialization, types like U256/H256 and hashing impls like twox/blake256: impl-serde = { workspace = true } -primitive-types = { workspace = true } -sp-core-hashing = { workspace = true } +primitive-types = { workspace = true, features = ["codec", "scale-info", "serde"] } +sp-crypto-hashing = { workspace = true } # For ss58 encoding AccountId32 to serialize them properly: base58 = { workspace = true } @@ -100,12 +102,9 @@ sp-runtime = { workspace = true, optional = true } # Other subxt crates we depend on. subxt-macro = { workspace = true } -subxt-metadata = { workspace = true } +subxt-metadata = { workspace = true, features = ["std"] } subxt-lightclient = { workspace = true, optional = true, default-features = false } -# Light client support: -tokio-stream = { workspace = true, optional = true } - # Reconnecting jsonrpc ws client reconnecting-jsonrpsee-ws-client = { version = "0.3", optional = true } @@ -136,13 +135,13 @@ wasm-bindgen-futures = { workspace = true } tracing-subscriber = { workspace = true } [[example]] -name = "light_client_tx_basic" -path = "examples/light_client_tx_basic.rs" +name = "light_client_basic" +path = "examples/light_client_basic.rs" required-features = ["unstable-light-client", "jsonrpsee"] [[example]] -name = "light_client_parachains" -path = "examples/light_client_parachains.rs" +name = "light_client_local_node" +path = "examples/light_client_local_node.rs" required-features = ["unstable-light-client", "jsonrpsee", "native"] [[example]] @@ -155,4 +154,4 @@ features = ["default", "substrate-compat", "unstable-light-client"] rustdoc-args = ["--cfg", "docsrs"] [package.metadata.playground] -features = ["default", "substrate-compat", "unstable-light-client"] +features = ["default", "substrate-compat", "unstable-light-client"] \ No newline at end of file diff --git a/subxt/examples/light_client_basic.rs b/subxt/examples/light_client_basic.rs new file mode 100644 index 0000000000..3b4eba6f9e --- /dev/null +++ b/subxt/examples/light_client_basic.rs @@ -0,0 +1,47 @@ +#![allow(missing_docs)] +use futures::StreamExt; +use subxt::{client::OnlineClient, lightclient::LightClient, PolkadotConfig}; + +// Generate an interface that we can use from the node's metadata. +#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] +pub mod polkadot {} + +const POLKADOT_SPEC: &str = include_str!("../../artifacts/demo_chain_specs/polkadot.json"); +const ASSET_HUB_SPEC: &str = + include_str!("../../artifacts/demo_chain_specs/polkadot_asset_hub.json"); + +#[tokio::main] +async fn main() -> Result<(), Box> { + // The lightclient logs are informative: + tracing_subscriber::fmt::init(); + + // Instantiate a light client with the Polkadot relay chain, + // and connect it to Asset Hub, too. + let (lightclient, polkadot_rpc) = LightClient::relay_chain(POLKADOT_SPEC)?; + let asset_hub_rpc = lightclient.parachain(ASSET_HUB_SPEC)?; + + // Create Subxt clients from these Smoldot backed RPC clients. + let polkadot_api = OnlineClient::::from_rpc_client(polkadot_rpc).await?; + let asset_hub_api = OnlineClient::::from_rpc_client(asset_hub_rpc).await?; + + // Use them! + let polkadot_sub = polkadot_api + .blocks() + .subscribe_finalized() + .await? + .map(|block| ("Polkadot", block)); + let parachain_sub = asset_hub_api + .blocks() + .subscribe_finalized() + .await? + .map(|block| ("AssetHub", block)); + + let mut stream_combinator = futures::stream::select(polkadot_sub, parachain_sub); + + while let Some((chain, block)) = stream_combinator.next().await { + let block = block?; + println!(" Chain {:?} hash={:?}", chain, block.hash()); + } + + Ok(()) +} diff --git a/subxt/examples/light_client_tx_basic.rs b/subxt/examples/light_client_local_node.rs similarity index 60% rename from subxt/examples/light_client_tx_basic.rs rename to subxt/examples/light_client_local_node.rs index 37ce6cb533..bcf492b41b 100644 --- a/subxt/examples/light_client_tx_basic.rs +++ b/subxt/examples/light_client_local_node.rs @@ -1,5 +1,10 @@ #![allow(missing_docs)] -use subxt::{client::LightClient, PolkadotConfig}; +use subxt::utils::fetch_chainspec_from_rpc_node; +use subxt::{ + client::OnlineClient, + lightclient::{ChainConfig, LightClient}, + PolkadotConfig, +}; use subxt_signer::sr25519::dev; // Generate an interface that we can use from the node's metadata. @@ -11,19 +16,23 @@ async fn main() -> Result<(), Box> { // The smoldot logs are informative: tracing_subscriber::fmt::init(); - // Create a light client by fetching the chain spec of a local running node. - // In this case, because we start one single node, the bootnodes must be overwritten - // for the light client to connect to the local node. + // Use a utility function to obtain a chain spec from a locally running node: + let chain_spec = fetch_chainspec_from_rpc_node("ws://127.0.0.1:9944").await?; + + // Configure the bootnodes of this chain spec. In this case, because we start one + // single node, the bootnodes must be overwritten for the light client to connect + // to the local node. // // The `12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp` is the P2P address // from a local polkadot node starting with // `--node-key 0000000000000000000000000000000000000000000000000000000000000001` - let api = LightClient::::builder() - .bootnodes([ - "/ip4/127.0.0.1/tcp/30333/p2p/12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp", - ]) - .build_from_url("ws://127.0.0.1:9944") - .await?; + let chain_config = ChainConfig::chain_spec(chain_spec.get()).set_bootnodes([ + "/ip4/127.0.0.1/tcp/30333/p2p/12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp", + ])?; + + // Start the light client up, establishing a connection to the local node. + let (_light_client, chain_rpc) = LightClient::relay_chain(chain_config)?; + let api = OnlineClient::::from_rpc_client(chain_rpc).await?; // Build a balance transfer extrinsic. let dest = dev::bob().public_key().into(); diff --git a/subxt/examples/light_client_parachains.rs b/subxt/examples/light_client_parachains.rs deleted file mode 100644 index 227da26fe0..0000000000 --- a/subxt/examples/light_client_parachains.rs +++ /dev/null @@ -1,102 +0,0 @@ -#![allow(missing_docs)] -use futures::StreamExt; -use std::{iter, num::NonZeroU32}; -use subxt::{ - client::{LightClient, RawLightClient}, - PolkadotConfig, -}; - -// Generate an interface that we can use from the node's metadata. -#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] -pub mod polkadot {} - -const POLKADOT_SPEC: &str = include_str!("../../artifacts/demo_chain_specs/polkadot.json"); -const ASSET_HUB_SPEC: &str = - include_str!("../../artifacts/demo_chain_specs/polkadot_asset_hub.json"); - -#[tokio::main] -async fn main() -> Result<(), Box> { - // The smoldot logs are informative: - tracing_subscriber::fmt::init(); - - // Connecting to a parachain is a multi step process. - - // Step 1. Construct a new smoldot client. - let mut client = - subxt_lightclient::smoldot::Client::new(subxt_lightclient::smoldot::DefaultPlatform::new( - "subxt-example-light-client".into(), - "version-0".into(), - )); - - // Step 2. Connect to the relay chain of the parachain. For this example, the Polkadot relay chain. - let polkadot_connection = client - .add_chain(subxt_lightclient::smoldot::AddChainConfig { - specification: POLKADOT_SPEC, - json_rpc: subxt_lightclient::smoldot::AddChainConfigJsonRpc::Enabled { - max_pending_requests: NonZeroU32::new(128).unwrap(), - max_subscriptions: 1024, - }, - potential_relay_chains: iter::empty(), - database_content: "", - user_data: (), - }) - .expect("Light client chain added with valid spec; qed"); - let polkadot_json_rpc_responses = polkadot_connection - .json_rpc_responses - .expect("Light client configured with json rpc enabled; qed"); - let polkadot_chain_id = polkadot_connection.chain_id; - - // Step 3. Connect to the parachain. For this example, the Asset hub parachain. - let assethub_connection = client - .add_chain(subxt_lightclient::smoldot::AddChainConfig { - specification: ASSET_HUB_SPEC, - json_rpc: subxt_lightclient::smoldot::AddChainConfigJsonRpc::Enabled { - max_pending_requests: NonZeroU32::new(128).unwrap(), - max_subscriptions: 1024, - }, - // The chain specification of the asset hub parachain mentions that the identifier - // of its relay chain is `polkadot`. - potential_relay_chains: [polkadot_chain_id].into_iter(), - database_content: "", - user_data: (), - }) - .expect("Light client chain added with valid spec; qed"); - let parachain_json_rpc_responses = assethub_connection - .json_rpc_responses - .expect("Light client configured with json rpc enabled; qed"); - let parachain_chain_id = assethub_connection.chain_id; - - // Step 4. Turn the smoldot client into a raw client. - let raw_light_client = RawLightClient::builder() - .add_chain(polkadot_chain_id, polkadot_json_rpc_responses) - .add_chain(parachain_chain_id, parachain_json_rpc_responses) - .build(client) - .await?; - - // Step 5. Obtain a client to target the relay chain and the parachain. - let polkadot_api: LightClient = - raw_light_client.for_chain(polkadot_chain_id).await?; - let parachain_api: LightClient = - raw_light_client.for_chain(parachain_chain_id).await?; - - // Step 6. Subscribe to the finalized blocks of the chains. - let polkadot_sub = polkadot_api - .blocks() - .subscribe_finalized() - .await? - .map(|block| ("Polkadot", block)); - let parachain_sub = parachain_api - .blocks() - .subscribe_finalized() - .await? - .map(|block| ("AssetHub", block)); - let mut stream_combinator = futures::stream::select(polkadot_sub, parachain_sub); - - while let Some((chain, block)) = stream_combinator.next().await { - let block = block?; - - println!(" Chain {:?} hash={:?}", chain, block.hash()); - } - - Ok(()) -} diff --git a/subxt/examples/rpc_legacy.rs b/subxt/examples/rpc_legacy.rs index f0b831c3b6..84bd837e2d 100644 --- a/subxt/examples/rpc_legacy.rs +++ b/subxt/examples/rpc_legacy.rs @@ -40,7 +40,10 @@ async fn main() -> Result<(), Box> { .await?; let current_header = rpc.chain_get_header(None).await?.unwrap(); - let ext_params = Params::new().mortal(¤t_header, 8).build(); + let ext_params = Params::new() + .mortal(¤t_header, 8) + .nonce(current_nonce) + .build(); let balance_transfer = polkadot::tx() .balances() @@ -48,7 +51,7 @@ async fn main() -> Result<(), Box> { let ext_hash = api .tx() - .create_signed_with_nonce(&balance_transfer, &alice, current_nonce, ext_params)? + .create_signed_offline(&balance_transfer, &alice, ext_params)? .submit() .await?; diff --git a/subxt/examples/setup_config_custom.rs b/subxt/examples/setup_config_custom.rs index 4748202e1f..df4dec9fae 100644 --- a/subxt/examples/setup_config_custom.rs +++ b/subxt/examples/setup_config_custom.rs @@ -1,7 +1,9 @@ #![allow(missing_docs)] use codec::Encode; use subxt::client::OfflineClientT; -use subxt::config::{Config, ExtrinsicParams, ExtrinsicParamsEncoder, ExtrinsicParamsError}; +use subxt::config::{ + Config, ExtrinsicParams, ExtrinsicParamsEncoder, ExtrinsicParamsError, RefineParams, +}; use subxt_signer::sr25519::dev; #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale")] @@ -51,24 +53,27 @@ impl CustomExtrinsicParamsBuilder { } } +impl RefineParams for CustomExtrinsicParamsBuilder {} + // Describe how to fetch and then encode the params: impl ExtrinsicParams for CustomExtrinsicParams { - type OtherParams = CustomExtrinsicParamsBuilder; + type Params = CustomExtrinsicParamsBuilder; // Gather together all of the params we will need to encode: fn new>( - _nonce: u64, client: Client, - other_params: Self::OtherParams, + params: Self::Params, ) -> Result { Ok(Self { genesis_hash: client.genesis_hash(), - tip: other_params.tip, - foo: other_params.foo, + tip: params.tip, + foo: params.foo, }) } } +impl RefineParams for CustomExtrinsicParams {} + // Encode the relevant params when asked: impl ExtrinsicParamsEncoder for CustomExtrinsicParams { fn encode_extra_to(&self, v: &mut Vec) { @@ -86,7 +91,7 @@ async fn main() { let tx_payload = runtime::tx().system().remark(b"Hello".to_vec()); - // Build your custom "OtherParams": + // Build your custom "Params": let tx_config = CustomExtrinsicParamsBuilder::new().tip(1234).enable_foo(); // And provide them when submitting a transaction: diff --git a/subxt/examples/setup_config_signed_extension.rs b/subxt/examples/setup_config_signed_extension.rs index 2442de629b..e4a2733be5 100644 --- a/subxt/examples/setup_config_signed_extension.rs +++ b/subxt/examples/setup_config_signed_extension.rs @@ -58,12 +58,11 @@ impl signed_extensions::SignedExtension for CustomSignedExtension // Gather together any params we need for our signed extension, here none. impl ExtrinsicParams for CustomSignedExtension { - type OtherParams = (); + type Params = (); fn new>( - _nonce: u64, _client: Client, - _other_params: Self::OtherParams, + _params: Self::Params, ) -> Result { Ok(CustomSignedExtension) } @@ -80,13 +79,13 @@ impl ExtrinsicParamsEncoder for CustomSignedExtension { } // When composing a tuple of signed extensions, the user parameters we need must -// be able to convert `Into` a tuple of corresponding `OtherParams`. Here, we just -// "hijack" the default param builder, but add the `OtherParams` (`()`) for our +// be able to convert `Into` a tuple of corresponding `Params`. Here, we just +// "hijack" the default param builder, but add the `Params` (`()`) for our // new signed extension at the end, to make the types line up. IN reality you may wish -// to construct an entirely new interface to provide the relevant `OtherParams`. +// to construct an entirely new interface to provide the relevant `Params`. pub fn custom( params: DefaultExtrinsicParamsBuilder, -) -> <::ExtrinsicParams as ExtrinsicParams>::OtherParams { +) -> <::ExtrinsicParams as ExtrinsicParams>::Params { let (a, b, c, d, e, f, g) = params.build(); (a, b, c, d, e, f, g, ()) } diff --git a/subxt/examples/storage_iterating.rs b/subxt/examples/storage_iterating.rs index e99bb884b3..f64fad6c8d 100644 --- a/subxt/examples/storage_iterating.rs +++ b/subxt/examples/storage_iterating.rs @@ -16,9 +16,10 @@ async fn main() -> Result<(), Box> { // a time from the node, but we always iterate over one at a time). let mut results = api.storage().at_latest().await?.iter(storage_query).await?; - while let Some(Ok((key, value))) = results.next().await { - println!("Key: 0x{}", hex::encode(&key)); - println!("Value: {:?}", value); + while let Some(Ok(kv)) = results.next().await { + println!("Keys decoded: {:?}", kv.keys); + println!("Key: 0x{}", hex::encode(&kv.key_bytes)); + println!("Value: {:?}", kv.value); } Ok(()) diff --git a/subxt/examples/storage_iterating_dynamic.rs b/subxt/examples/storage_iterating_dynamic.rs index 391ce60cd7..a768e6768e 100644 --- a/subxt/examples/storage_iterating_dynamic.rs +++ b/subxt/examples/storage_iterating_dynamic.rs @@ -7,16 +7,17 @@ async fn main() -> Result<(), Box> { let api = OnlineClient::::new().await?; // Build a dynamic storage query to iterate account information. - // With a dynamic query, we can just provide an empty Vec as the keys to iterate over all entries. - let keys = Vec::<()>::new(); + // With a dynamic query, we can just provide an empty vector as the keys to iterate over all entries. + let keys: Vec = vec![]; let storage_query = subxt::dynamic::storage("System", "Account", keys); // Use that query to return an iterator over the results. let mut results = api.storage().at_latest().await?.iter(storage_query).await?; - while let Some(Ok((key, value))) = results.next().await { - println!("Key: 0x{}", hex::encode(&key)); - println!("Value: {:?}", value.to_value()?); + while let Some(Ok(kv)) = results.next().await { + println!("Keys decoded: {:?}", kv.keys); + println!("Key: 0x{}", hex::encode(&kv.key_bytes)); + println!("Value: {:?}", kv.value.to_value()?); } Ok(()) diff --git a/subxt/examples/storage_iterating_partial.rs b/subxt/examples/storage_iterating_partial.rs index eb89dd2e15..d8d800faf4 100644 --- a/subxt/examples/storage_iterating_partial.rs +++ b/subxt/examples/storage_iterating_partial.rs @@ -38,11 +38,11 @@ async fn main() -> Result<(), Box> { // Get back an iterator of results. let mut results = api.storage().at_latest().await?.iter(storage_query).await?; - while let Some(Ok((key, value))) = results.next().await { - println!("Key: 0x{}", hex::encode(&key)); - println!("Value: {:?}", value); + while let Some(Ok(kv)) = results.next().await { + println!("Keys decoded: {:?}", kv.keys); + println!("Key: 0x{}", hex::encode(&kv.key_bytes)); + println!("Value: {:?}", kv.value); } - Ok(()) } diff --git a/subxt/src/backend/legacy/mod.rs b/subxt/src/backend/legacy/mod.rs index cffb3f4475..8d9f331fac 100644 --- a/subxt/src/backend/legacy/mod.rs +++ b/subxt/src/backend/legacy/mod.rs @@ -22,18 +22,56 @@ use std::task::{Context, Poll}; // Expose the RPC methods. pub use rpc_methods::LegacyRpcMethods; +/// Configure and build an [`LegacyBackend`]. +pub struct LegacyBackendBuilder { + storage_page_size: u32, + _marker: std::marker::PhantomData, +} + +impl Default for LegacyBackendBuilder { + fn default() -> Self { + Self::new() + } +} + +impl LegacyBackendBuilder { + /// Create a new [`LegacyBackendBuilder`]. + pub fn new() -> Self { + Self { + storage_page_size: 64, + _marker: std::marker::PhantomData, + } + } + + /// Iterating over storage entries using the [`LegacyBackend`] requires + /// fetching entries in batches. This configures the number of entries that + /// we'll try to obtain in each batch (default: 64). + pub fn storage_page_size(mut self, storage_page_size: u32) -> Self { + self.storage_page_size = storage_page_size; + self + } + + /// Given an [`RpcClient`] to use to make requests, this returns a [`LegacyBackend`], + /// which implements the [`Backend`] trait. + pub fn build(self, client: impl Into) -> LegacyBackend { + LegacyBackend { + storage_page_size: self.storage_page_size, + methods: LegacyRpcMethods::new(client.into()), + } + } +} + /// The legacy backend. #[derive(Debug, Clone)] pub struct LegacyBackend { + storage_page_size: u32, methods: LegacyRpcMethods, } impl LegacyBackend { - /// Instantiate a new backend which uses the legacy API methods. - pub fn new(client: RpcClient) -> Self { - Self { - methods: LegacyRpcMethods::new(client), - } + /// Configure and construct an [`LegacyBackend`]. + pub fn builder() -> LegacyBackendBuilder { + LegacyBackendBuilder::new() } } @@ -74,6 +112,7 @@ impl Backend for LegacyBackend { let keys = StorageFetchDescendantKeysStream { at, key, + storage_page_size: self.storage_page_size, methods: self.methods.clone(), done: Default::default(), keys_fut: Default::default(), @@ -104,6 +143,7 @@ impl Backend for LegacyBackend { let keys_stream = StorageFetchDescendantKeysStream { at, key, + storage_page_size: self.storage_page_size, methods: self.methods.clone(), done: Default::default(), keys_fut: Default::default(), @@ -332,9 +372,6 @@ where }) } -/// How many keys/values to fetch at once. -const STORAGE_PAGE_SIZE: u32 = 32; - /// This provides a stream of values given some prefix `key`. It /// internally manages pagination and such. #[allow(clippy::type_complexity)] @@ -342,6 +379,8 @@ pub struct StorageFetchDescendantKeysStream { methods: LegacyRpcMethods, key: Vec, at: T::Hash, + // How many entries to ask for each time. + storage_page_size: u32, // What key do we start paginating from? None = from the beginning. pagination_start_key: Option>, // Keys, future and cached: @@ -392,12 +431,13 @@ impl Stream for StorageFetchDescendantKeysStream { let methods = this.methods.clone(); let key = this.key.clone(); let at = this.at; + let storage_page_size = this.storage_page_size; let pagination_start_key = this.pagination_start_key.take(); let keys_fut = async move { methods .state_get_keys_paged( &key, - STORAGE_PAGE_SIZE, + storage_page_size, pagination_start_key.as_deref(), Some(at), ) diff --git a/subxt/src/backend/rpc/lightclient_impl.rs b/subxt/src/backend/rpc/lightclient_impl.rs new file mode 100644 index 0000000000..f4e0deec6a --- /dev/null +++ b/subxt/src/backend/rpc/lightclient_impl.rs @@ -0,0 +1,53 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + +use super::{RawRpcFuture, RawRpcSubscription, RpcClientT}; +use crate::error::RpcError; +use futures::stream::{StreamExt, TryStreamExt}; +use serde_json::value::RawValue; +use subxt_lightclient::{LightClientRpc, LightClientRpcError}; + +impl RpcClientT for LightClientRpc { + fn request_raw<'a>( + &'a self, + method: &'a str, + params: Option>, + ) -> RawRpcFuture<'a, Box> { + Box::pin(async move { + let res = self.request(method.to_owned(), params) + .await + .map_err(lc_err_to_rpc_err)?; + + Ok(res) + }) + } + + fn subscribe_raw<'a>( + &'a self, + sub: &'a str, + params: Option>, + unsub: &'a str, + ) -> RawRpcFuture<'a, RawRpcSubscription> { + Box::pin(async move { + let sub = self.subscribe(sub.to_owned(), params, unsub.to_owned()) + .await + .map_err(lc_err_to_rpc_err)?; + + let id = Some(sub.id().to_owned()); + let stream = sub + .map_err(|e| RpcError::ClientError(Box::new(e))) + .boxed(); + + Ok(RawRpcSubscription { id, stream }) + }) + } +} + +fn lc_err_to_rpc_err(err: LightClientRpcError) -> RpcError { + match err { + LightClientRpcError::JsonRpcError(e) => RpcError::ClientError(Box::new(e)), + LightClientRpcError::SmoldotError(e) => RpcError::RequestRejected(e), + LightClientRpcError::BackgroundTaskDropped => RpcError::SubscriptionDropped, + } +} \ No newline at end of file diff --git a/subxt/src/backend/rpc/mod.rs b/subxt/src/backend/rpc/mod.rs index 19101dd5df..453fcf5a7f 100644 --- a/subxt/src/backend/rpc/mod.rs +++ b/subxt/src/backend/rpc/mod.rs @@ -60,6 +60,10 @@ crate::macros::cfg_jsonrpsee! { mod jsonrpsee_impl; } +crate::macros::cfg_unstable_light_client! { + mod lightclient_impl; +} + crate::macros::cfg_reconnecting_rpc_client! { mod reconnecting_jsonrpsee_impl; pub use reconnecting_jsonrpsee_ws_client as reconnecting_rpc_client; diff --git a/subxt/src/backend/rpc/rpc_client.rs b/subxt/src/backend/rpc/rpc_client.rs index d960c010db..16dba9e6fb 100644 --- a/subxt/src/backend/rpc/rpc_client.rs +++ b/subxt/src/backend/rpc/rpc_client.rs @@ -79,6 +79,12 @@ impl RpcClient { } } +impl From for RpcClient { + fn from(client: C) -> Self { + RpcClient::new(client) + } +} + impl std::fmt::Debug for RpcClient { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_tuple("RpcClient").finish() diff --git a/subxt/src/backend/unstable/follow_stream.rs b/subxt/src/backend/unstable/follow_stream.rs index 9474f7a302..71af824831 100644 --- a/subxt/src/backend/unstable/follow_stream.rs +++ b/subxt/src/backend/unstable/follow_stream.rs @@ -243,7 +243,7 @@ pub(super) mod test_utils { /// An initialized event pub fn ev_initialized(n: u64) -> FollowEvent { FollowEvent::Initialized(Initialized { - finalized_block_hash: H256::from_low_u64_le(n), + finalized_block_hashes: vec![H256::from_low_u64_le(n)], finalized_block_runtime: None, }) } diff --git a/subxt/src/backend/unstable/follow_stream_driver.rs b/subxt/src/backend/unstable/follow_stream_driver.rs index d32c98a104..e85336c314 100644 --- a/subxt/src/backend/unstable/follow_stream_driver.rs +++ b/subxt/src/backend/unstable/follow_stream_driver.rs @@ -267,9 +267,9 @@ impl Shared { shared.seen_runtime_events.clear(); - if let Some(finalized) = finalized_ev.finalized_block_hashes.last() { - init_message.finalized_block_hash = finalized.clone(); - } + init_message.finalized_block_hashes = + finalized_ev.finalized_block_hashes.clone(); + if let Some(runtime_ev) = newest_runtime { init_message.finalized_block_runtime = Some(runtime_ev); } diff --git a/subxt/src/backend/unstable/follow_stream_unpin.rs b/subxt/src/backend/unstable/follow_stream_unpin.rs index ca00e37690..c128a86cf3 100644 --- a/subxt/src/backend/unstable/follow_stream_unpin.rs +++ b/subxt/src/backend/unstable/follow_stream_unpin.rs @@ -10,6 +10,7 @@ use crate::backend::unstable::rpc_methods::{ use crate::config::{BlockHash, Config}; use crate::error::Error; use futures::stream::{FuturesUnordered, Stream, StreamExt}; + use std::collections::{HashMap, HashSet}; use std::future::Future; use std::pin::Pin; @@ -34,9 +35,11 @@ pub struct FollowStreamUnpin { // Futures for sending unpin events that we'll poll to completion as // part of polling the stream as a whole. unpin_futs: FuturesUnordered, - // Each new finalized block increments this. Allows us to track - // the age of blocks so that we can unpin old ones. - rel_block_num: usize, + // Each time a new finalized block is seen, we give it an age of `next_rel_block_age`, + // and then increment this ready for the next finalized block. So, the first finalized + // block will have an age of 0, the next 1, 2, 3 and so on. We can then use `max_block_life` + // to say "unpin all blocks with an age < (next_rel_block_age-1) - max_block_life". + next_rel_block_age: usize, // The latest ID of the FollowStream subscription, which we can use // to unpin blocks. subscription_id: Option>, @@ -113,15 +116,23 @@ impl Stream for FollowStreamUnpin { FollowStreamMsg::Ready(subscription_id) } FollowStreamMsg::Event(FollowEvent::Initialized(details)) => { - // The first finalized block gets the starting block_num. - let rel_block_num = this.rel_block_num; - // Pin this block, but note that it can be unpinned any time since it won't show up again (except - // as a parent block, which we are ignoring at the moment). - let block_ref = - this.pin_unpinnable_block_at(rel_block_num, details.finalized_block_hash); + let mut finalized_block_hashes = + Vec::with_capacity(details.finalized_block_hashes.len()); + + // Pin each of the finalized blocks. None of them will show up again (except as a + // parent block), and so they can all be unpinned immediately at any time. Increment + // the block age for each one, so that older finalized blocks are pruned first. + for finalized_block in &details.finalized_block_hashes { + let rel_block_age = this.next_rel_block_age; + let block_ref = + this.pin_unpinnable_block_at(rel_block_age, *finalized_block); + + finalized_block_hashes.push(block_ref); + this.next_rel_block_age += 1; + } FollowStreamMsg::Event(FollowEvent::Initialized(Initialized { - finalized_block_hash: block_ref, + finalized_block_hashes, finalized_block_runtime: details.finalized_block_runtime, })) } @@ -129,15 +140,15 @@ impl Stream for FollowStreamUnpin { // One bigger than our parent, and if no parent seen (maybe it was // unpinned already), then one bigger than the last finalized block num // as a best guess. - let parent_rel_block_num = this + let parent_rel_block_age = this .pinned .get(&details.parent_block_hash) - .map(|p| p.rel_block_num) - .unwrap_or(this.rel_block_num); + .map(|p| p.rel_block_age) + .unwrap_or(this.next_rel_block_age.saturating_sub(1)); - let block_ref = this.pin_block_at(parent_rel_block_num + 1, details.block_hash); + let block_ref = this.pin_block_at(parent_rel_block_age + 1, details.block_hash); let parent_block_ref = - this.pin_block_at(parent_rel_block_num, details.parent_block_hash); + this.pin_block_at(parent_rel_block_age, details.parent_block_hash); FollowStreamMsg::Event(FollowEvent::NewBlock(NewBlock { block_hash: block_ref, @@ -148,8 +159,8 @@ impl Stream for FollowStreamUnpin { FollowStreamMsg::Event(FollowEvent::BestBlockChanged(details)) => { // We expect this block to already exist, so it'll keep its existing block_num, // but worst case it'll just get the current finalized block_num + 1. - let rel_block_num = this.rel_block_num + 1; - let block_ref = this.pin_block_at(rel_block_num, details.best_block_hash); + let rel_block_age = this.next_rel_block_age; + let block_ref = this.pin_block_at(rel_block_age, details.best_block_hash); FollowStreamMsg::Event(FollowEvent::BestBlockChanged(BestBlockChanged { best_block_hash: block_ref, @@ -167,14 +178,14 @@ impl Stream for FollowStreamUnpin { // // `pin_unpinnable_block_at` indicates that the block will not show up in future events // (They will show up as a parent block, but we don't care about that right now). - let rel_block_num = this.rel_block_num + idx + 1; - this.pin_unpinnable_block_at(rel_block_num, hash) + let rel_block_age = this.next_rel_block_age + idx; + this.pin_unpinnable_block_at(rel_block_age, hash) }) .collect(); // Our relative block height is increased by however many finalized // blocks we've seen. - this.rel_block_num += finalized_block_refs.len(); + this.next_rel_block_age += finalized_block_refs.len(); let pruned_block_refs: Vec<_> = details .pruned_block_hashes @@ -183,8 +194,8 @@ impl Stream for FollowStreamUnpin { // We should know about these, too, and if not we set their age to last_finalized + 1. // // `pin_unpinnable_block_at` indicates that the block will not show up in future events. - let rel_block_num = this.rel_block_num + 1; - this.pin_unpinnable_block_at(rel_block_num, hash) + let rel_block_age = this.next_rel_block_age; + this.pin_unpinnable_block_at(rel_block_age, hash) }) .collect(); @@ -208,7 +219,7 @@ impl Stream for FollowStreamUnpin { this.pinned.clear(); this.unpin_futs.clear(); this.unpin_flags.lock().unwrap().clear(); - this.rel_block_num = 0; + this.next_rel_block_age = 0; FollowStreamMsg::Event(FollowEvent::Stop) } @@ -255,7 +266,7 @@ impl FollowStreamUnpin { max_block_life, pinned: Default::default(), subscription_id: None, - rel_block_num: 0, + next_rel_block_age: 0, unpin_flags: Default::default(), unpin_futs: Default::default(), } @@ -287,21 +298,21 @@ impl FollowStreamUnpin { /// Pin a block, or return the reference to an already-pinned block. If the block has been registered to /// be unpinned, we'll clear those flags, so that it won't be unpinned. If the unpin request has already /// been sent though, then the block will be unpinned. - fn pin_block_at(&mut self, rel_block_num: usize, hash: Hash) -> BlockRef { - self.pin_block_at_setting_unpinnable_flag(rel_block_num, hash, false) + fn pin_block_at(&mut self, rel_block_age: usize, hash: Hash) -> BlockRef { + self.pin_block_at_setting_unpinnable_flag(rel_block_age, hash, false) } /// Pin a block, or return the reference to an already-pinned block. /// /// This is the same as [`Self::pin_block_at`], except that it also marks the block as being unpinnable now, /// which should be done for any block that will no longer be seen in future events. - fn pin_unpinnable_block_at(&mut self, rel_block_num: usize, hash: Hash) -> BlockRef { - self.pin_block_at_setting_unpinnable_flag(rel_block_num, hash, true) + fn pin_unpinnable_block_at(&mut self, rel_block_age: usize, hash: Hash) -> BlockRef { + self.pin_block_at_setting_unpinnable_flag(rel_block_age, hash, true) } fn pin_block_at_setting_unpinnable_flag( &mut self, - rel_block_num: usize, + rel_block_age: usize, hash: Hash, can_be_unpinned: bool, ) -> BlockRef { @@ -317,7 +328,7 @@ impl FollowStreamUnpin { }) // If there's not an entry already, make one and return it. .or_insert_with(|| PinnedDetails { - rel_block_num, + rel_block_age, block_ref: BlockRef { inner: Arc::new(BlockRefInner { hash, @@ -333,7 +344,9 @@ impl FollowStreamUnpin { /// Unpin any blocks that are either too old, or have the unpin flag set and are old enough. fn unpin_blocks(&mut self, waker: &Waker) { let mut unpin_flags = self.unpin_flags.lock().unwrap(); - let rel_block_num = self.rel_block_num; + + // This gets the age of the last finalized block. + let rel_block_age = self.next_rel_block_age.saturating_sub(1); // If we asked to unpin and there was no subscription_id, then there's nothing we can do, // and nothing will need unpinning now anyway. @@ -343,7 +356,7 @@ impl FollowStreamUnpin { let mut blocks_to_unpin = vec![]; for (hash, details) in &self.pinned { - if rel_block_num.saturating_sub(details.rel_block_num) >= self.max_block_life + if rel_block_age.saturating_sub(details.rel_block_age) >= self.max_block_life || (unpin_flags.contains(hash) && details.can_be_unpinned) { // The block is too old, or it's been flagged to be unpinned and won't be in a future @@ -381,8 +394,10 @@ type UnpinFlags = Arc>>; #[derive(Debug)] struct PinnedDetails { - /// How old is the block? - rel_block_num: usize, + /// Realtively speaking, how old is the block? When we start following + /// blocks, the first finalized block gets an age of 0, the second an age + /// of 1 and so on. + rel_block_age: usize, /// A block ref we can hand out to keep blocks pinned. /// Because we store one here until it's unpinned, the live count /// will only drop to 1 when no external refs are left. @@ -502,7 +517,7 @@ pub(super) mod test_utils { /// An initialized event containing a BlockRef (useful for comparisons) pub fn ev_initialized_ref(n: u64) -> FollowEvent> { FollowEvent::Initialized(Initialized { - finalized_block_hash: BlockRef::new(H256::from_low_u64_le(n)), + finalized_block_hashes: vec![BlockRef::new(H256::from_low_u64_le(n))], finalized_block_runtime: None, }) } diff --git a/subxt/src/backend/unstable/mod.rs b/subxt/src/backend/unstable/mod.rs index 21a9cca504..4fe70bc374 100644 --- a/subxt/src/backend/unstable/mod.rs +++ b/subxt/src/backend/unstable/mod.rs @@ -75,9 +75,12 @@ impl UnstableBackendBuilder { /// Given an [`RpcClient`] to use to make requests, this returns a tuple of an [`UnstableBackend`], /// which implements the [`Backend`] trait, and an [`UnstableBackendDriver`] which must be polled in /// order for the backend to make progress. - pub fn build(self, client: RpcClient) -> (UnstableBackend, UnstableBackendDriver) { + pub fn build( + self, + client: impl Into, + ) -> (UnstableBackend, UnstableBackendDriver) { // Construct the underlying follow_stream layers: - let rpc_methods = UnstableRpcMethods::new(client); + let rpc_methods = UnstableRpcMethods::new(client.into()); let follow_stream = follow_stream::FollowStream::::from_methods(rpc_methods.clone()); let follow_stream_unpin = follow_stream_unpin::FollowStreamUnpin::::from_methods( @@ -321,7 +324,9 @@ impl Backend for UnstableBackend { .events() .filter_map(|ev| { let out = match ev { - FollowEvent::Initialized(init) => Some(init.finalized_block_hash.into()), + FollowEvent::Initialized(init) => { + init.finalized_block_hashes.last().map(|b| b.clone().into()) + } _ => None, }; std::future::ready(out) @@ -353,7 +358,10 @@ impl Backend for UnstableBackend { .filter_map(move |ev| { let output = match ev { FollowEvent::Initialized(ev) => { - runtimes.remove(&ev.finalized_block_hash.hash()); + for finalized_block in ev.finalized_block_hashes { + runtimes.remove(&finalized_block.hash()); + } + ev.finalized_block_runtime } FollowEvent::NewBlock(ev) => { @@ -422,9 +430,11 @@ impl Backend for UnstableBackend { &self, ) -> Result)>, Error> { self.stream_headers(|ev| match ev { - FollowEvent::Initialized(ev) => Some(ev.finalized_block_hash), - FollowEvent::NewBlock(ev) => Some(ev.block_hash), - _ => None, + FollowEvent::Initialized(init) => init.finalized_block_hashes, + FollowEvent::NewBlock(ev) => { + vec![ev.block_hash] + } + _ => vec![], }) .await } @@ -433,9 +443,9 @@ impl Backend for UnstableBackend { &self, ) -> Result)>, Error> { self.stream_headers(|ev| match ev { - FollowEvent::Initialized(ev) => Some(ev.finalized_block_hash), - FollowEvent::BestBlockChanged(ev) => Some(ev.best_block_hash), - _ => None, + FollowEvent::Initialized(init) => init.finalized_block_hashes, + FollowEvent::BestBlockChanged(ev) => vec![ev.best_block_hash], + _ => vec![], }) .await } @@ -444,9 +454,7 @@ impl Backend for UnstableBackend { &self, ) -> Result)>, Error> { self.stream_headers(|ev| match ev { - FollowEvent::Initialized(ev) => { - vec![ev.finalized_block_hash] - } + FollowEvent::Initialized(init) => init.finalized_block_hashes, FollowEvent::Finalized(ev) => ev.finalized_block_hashes, _ => vec![], }) diff --git a/subxt/src/backend/unstable/rpc_methods.rs b/subxt/src/backend/unstable/rpc_methods.rs index c51e5020cb..fd2a1dcf9c 100644 --- a/subxt/src/backend/unstable/rpc_methods.rs +++ b/subxt/src/backend/unstable/rpc_methods.rs @@ -288,6 +288,28 @@ impl UnstableRpcMethods { Ok(TransactionSubscription { sub, done: false }) } + + /// Broadcast the transaction on the p2p network until the + /// [`Self::transaction_unstable_stop`] is called. + /// + /// Returns an operation ID that can be used to stop the broadcasting process. + /// Returns `None` if the server cannot handle the request at the moment. + pub async fn transaction_unstable_broadcast(&self, tx: &[u8]) -> Result, Error> { + self.client + .request("transaction_unstable_broadcast", rpc_params![to_hex(tx)]) + .await + } + + /// Stop the broadcasting process of the transaction. + /// + /// The operation ID is obtained from the [`Self::transaction_unstable_broadcast`] method. + /// + /// Returns an error if the operation ID does not correspond to any active transaction for this connection. + pub async fn transaction_unstable_stop(&self, operation_id: &str) -> Result<(), Error> { + self.client + .request("transaction_unstable_stop", rpc_params![operation_id]) + .await + } } /// This represents events generated by the `follow` method. @@ -359,8 +381,8 @@ pub enum FollowEvent { #[derive(Debug, Clone, PartialEq, Eq, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Initialized { - /// The hash of the latest finalized block. - pub finalized_block_hash: Hash, + /// The hashes of the last finalized blocks. + pub finalized_block_hashes: Vec, /// The runtime version of the finalized block. /// /// # Note diff --git a/subxt/src/blocks/extrinsic_types.rs b/subxt/src/blocks/extrinsic_types.rs index 333ee5bfe8..32bdb057e9 100644 --- a/subxt/src/blocks/extrinsic_types.rs +++ b/subxt/src/blocks/extrinsic_types.rs @@ -245,27 +245,27 @@ where // Skip over the address, signature and extra fields. scale_decode::visitor::decode_with_visitor( cursor, - ids.address, + &ids.address, metadata.types(), - scale_decode::visitor::IgnoreVisitor, + scale_decode::visitor::IgnoreVisitor::new(), ) .map_err(scale_decode::Error::from)?; let address_end_idx = bytes.len() - cursor.len(); scale_decode::visitor::decode_with_visitor( cursor, - ids.signature, + &ids.signature, metadata.types(), - scale_decode::visitor::IgnoreVisitor, + scale_decode::visitor::IgnoreVisitor::new(), ) .map_err(scale_decode::Error::from)?; let signature_end_idx = bytes.len() - cursor.len(); scale_decode::visitor::decode_with_visitor( cursor, - ids.extra, + &ids.extra, metadata.types(), - scale_decode::visitor::IgnoreVisitor, + scale_decode::visitor::IgnoreVisitor::new(), ) .map_err(scale_decode::Error::from)?; let extra_end_idx = bytes.len() - cursor.len(); @@ -420,9 +420,7 @@ where /// Decode and provide the extrinsic fields back in the form of a [`scale_value::Composite`] /// type which represents the named or unnamed fields that were present in the extrinsic. - pub fn field_values( - &self, - ) -> Result, Error> { + pub fn field_values(&self) -> Result, Error> { let bytes = &mut self.field_bytes(); let extrinsic_metadata = self.extrinsic_metadata()?; @@ -430,12 +428,9 @@ where .variant .fields .iter() - .map(|f| scale_decode::Field::new(f.ty.id, f.name.as_deref())); - let decoded = >::decode_as_fields( - bytes, - &mut fields, - self.metadata.types(), - )?; + .map(|f| scale_decode::Field::new(&f.ty.id, f.name.as_deref())); + let decoded = + scale_value::scale::decode_as_fields(bytes, &mut fields, self.metadata.types())?; Ok(decoded) } @@ -451,7 +446,7 @@ where .variant .fields .iter() - .map(|f| scale_decode::Field::new(f.ty.id, f.name.as_deref())); + .map(|f| scale_decode::Field::new(&f.ty.id, f.name.as_deref())); let decoded = E::decode_as_fields(&mut self.field_bytes(), &mut fields, self.metadata.types())?; Ok(Some(decoded)) @@ -466,7 +461,7 @@ where pub fn as_root_extrinsic(&self) -> Result { let decoded = E::decode_as_type( &mut &self.call_bytes()[..], - self.metadata.outer_enums().call_enum_ty(), + &self.metadata.outer_enums().call_enum_ty(), self.metadata.types(), )?; @@ -651,9 +646,9 @@ impl<'a, T: Config> ExtrinsicSignedExtensions<'a, T> { let cursor = &mut &bytes[byte_start_idx..]; if let Err(err) = scale_decode::visitor::decode_with_visitor( cursor, - ty_id, + &ty_id, metadata.types(), - scale_decode::visitor::IgnoreVisitor, + scale_decode::visitor::IgnoreVisitor::new(), ) .map_err(|e| Error::Decode(e.into())) { @@ -748,7 +743,12 @@ impl<'a, T: Config> ExtrinsicSignedExtension<'a, T> { /// Signed Extension as a [`scale_value::Value`] pub fn value(&self) -> Result { - self.as_type() + let value = scale_value::scale::decode_as_type( + &mut &self.bytes[..], + &self.ty_id, + self.metadata.types(), + )?; + Ok(value) } /// Decodes the bytes of this Signed Extension into its associated `Decoded` type. @@ -762,7 +762,7 @@ impl<'a, T: Config> ExtrinsicSignedExtension<'a, T> { } fn as_type(&self) -> Result { - let value = E::decode_as_type(&mut &self.bytes[..], self.ty_id, self.metadata.types())?; + let value = E::decode_as_type(&mut &self.bytes[..], &self.ty_id, self.metadata.types())?; Ok(value) } } diff --git a/subxt/src/book/setup/config.rs b/subxt/src/book/setup/config.rs index 6e6e811a55..a26ee75a94 100644 --- a/subxt/src/book/setup/config.rs +++ b/subxt/src/book/setup/config.rs @@ -71,7 +71,7 @@ //! //! The `ExtrinsicParams` config type expects to be given an implementation of the [`crate::config::ExtrinsicParams`] trait. //! Implementations of the [`crate::config::ExtrinsicParams`] trait are handed some parameters from Subxt itself, and can -//! accept arbitrary `OtherParams` from users, and are then expected to provide this "extra" and "additional" data when asked +//! accept arbitrary other `Params` from users, and are then expected to provide this "extra" and "additional" data when asked //! via the required [`crate::config::ExtrinsicParamsEncoder`] impl. //! //! **In most cases, the default [crate::config::DefaultExtrinsicParams] type will work**: it understands the "standard" diff --git a/subxt/src/book/usage/light_client.rs b/subxt/src/book/usage/light_client.rs index 33dbc6668b..c7b6e53318 100644 --- a/subxt/src/book/usage/light_client.rs +++ b/subxt/src/book/usage/light_client.rs @@ -8,25 +8,33 @@ //! node. This means that you don't have to trust a specific node when interacting with some chain. //! //! This feature is currently unstable. Use the `unstable-light-client` feature flag to enable it. -//! To use this in WASM environments, also enable the `web` feature flag. +//! To use this in WASM environments, enable the `web` feature flag and disable the "native" one. //! //! To connect to a blockchain network, the Light Client requires a trusted sync state of the network, //! known as a _chain spec_. One way to obtain this is by making a `sync_state_genSyncSpec` RPC call to a //! trusted node belonging to the chain that you wish to interact with. //! -//! The following is an example of fetching the chain spec from a local running node on port 9933: +//! Subxt exposes a utility method to obtain the chain spec: [`crate::utils::fetch_chainspec_from_rpc_node()`]. +//! Alternately, you can manually make an RPC call to `sync_state_genSyncSpec` like do (assuming a node running +//! locally on port 9933): //! //! ```bash //! curl -H "Content-Type: application/json" -d '{"id":1, "jsonrpc":"2.0", "method": "sync_state_genSyncSpec", "params":[true]}' http://localhost:9933/ | jq .result > chain_spec.json //! ``` //! -//! Alternately, you can have the `LightClient` download the chain spec from a trusted node when it -//! initializes, which is not recommended in production but is useful for examples and testing, as below. -//! //! ## Examples //! //! ### Basic Example //! +//! This basic example uses some already-known chain specs to connect to a relay chain and parachain +//! and stream information about their finalized blocks: +//! +//! ```rust,ignore +#![doc = include_str!("../../../examples/light_client_basic.rs")] +//! ``` +//! +//! ### Connecting to a local node +//! //! This example connects to a local chain and submits a transaction. To run this, you first need //! to have a local polkadot node running using the following command: //! @@ -34,23 +42,10 @@ //! polkadot --dev --node-key 0000000000000000000000000000000000000000000000000000000000000001 //! ``` //! -//! Leave that running for a minute, and then you can run the example using the following command -//! in the `subxt` crate: -//! -//! ```bash -//! cargo run --example light_client_tx_basic --features=unstable-light-client -//! ``` -//! -//! This is the code that will be executed: +//! Then, the following code will download a chain spec from this local node, alter the bootnodes +//! to point only to the local node, and then submit a transaction through it. //! //! ```rust,ignore -#![doc = include_str!("../../../examples/light_client_tx_basic.rs")] +#![doc = include_str!("../../../examples/light_client_local_node.rs")] //! ``` //! -//! ### Connecting to a parachain -//! -//! This example connects to a parachain using the light client. Currently, it's quite verbose to do this. -//! -//! ```rust,ignore -#![doc = include_str!("../../../examples/light_client_parachains.rs")] -//! ``` diff --git a/subxt/src/book/usage/storage.rs b/subxt/src/book/usage/storage.rs index 6d636c6bc3..f1c9ede5ef 100644 --- a/subxt/src/book/usage/storage.rs +++ b/subxt/src/book/usage/storage.rs @@ -49,7 +49,7 @@ //! // A static query capable of iterating over accounts: //! let storage_query = polkadot::storage().system().account_iter(); //! // A dynamic query to do the same: -//! let storage_query = subxt::dynamic::storage("System", "Account", Vec::::new()); +//! let storage_query = subxt::dynamic::storage("System", "Account", ()); //! ``` //! //! Some storage entries are maps with multiple keys. As an example, we might end up with diff --git a/subxt/src/book/usage/transactions.rs b/subxt/src/book/usage/transactions.rs index 6cbae2fa4c..e900846af2 100644 --- a/subxt/src/book/usage/transactions.rs +++ b/subxt/src/book/usage/transactions.rs @@ -137,11 +137,10 @@ //! Value::from_bytes("Hello there") //! ]); //! -//! // Construct the tx but don't sign it. You need to provide the nonce -//! // here, or can use `create_partial_signed` to fetch the correct nonce. -//! let partial_tx = client.tx().create_partial_signed_with_nonce( +//! // Construct the tx but don't sign it. The account nonce here defaults to 0. +//! // You can use `create_partial_signed` to fetch the correct nonce. +//! let partial_tx = client.tx().create_partial_signed_offline( //! &payload, -//! 0u64, //! Default::default() //! )?; //! diff --git a/subxt/src/client/light_client/builder.rs b/subxt/src/client/light_client/builder.rs deleted file mode 100644 index 68db1631e1..0000000000 --- a/subxt/src/client/light_client/builder.rs +++ /dev/null @@ -1,336 +0,0 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. -// This file is dual-licensed as Apache-2.0 or GPL-3.0. -// see LICENSE for license details. - -use super::{rpc::LightClientRpc, LightClient, LightClientError}; -use crate::backend::rpc::RpcClient; -use crate::client::RawLightClient; -use crate::macros::{cfg_jsonrpsee_native, cfg_jsonrpsee_web}; -use crate::{config::Config, error::Error, OnlineClient}; -use std::num::NonZeroU32; -use subxt_lightclient::{smoldot, AddedChain}; - -#[cfg(feature = "jsonrpsee")] -use crate::utils::validate_url_is_secure; - -/// Builder for [`LightClient`]. -#[derive(Clone, Debug)] -pub struct LightClientBuilder { - max_pending_requests: NonZeroU32, - max_subscriptions: u32, - bootnodes: Option>, - potential_relay_chains: Option>, - _marker: std::marker::PhantomData, -} - -impl Default for LightClientBuilder { - fn default() -> Self { - Self { - max_pending_requests: NonZeroU32::new(128) - .expect("Valid number is greater than zero; qed"), - max_subscriptions: 1024, - bootnodes: None, - potential_relay_chains: None, - _marker: std::marker::PhantomData, - } - } -} - -impl LightClientBuilder { - /// Create a new [`LightClientBuilder`]. - pub fn new() -> LightClientBuilder { - LightClientBuilder::default() - } - - /// Overwrite the bootnodes of the chain specification. - /// - /// Can be used to provide trusted entities to the chain spec, or for - /// testing environments. - pub fn bootnodes<'a>(mut self, bootnodes: impl IntoIterator) -> Self { - self.bootnodes = Some(bootnodes.into_iter().map(Into::into).collect()); - self - } - - /// Maximum number of JSON-RPC in the queue of requests waiting to be processed. - /// This parameter is necessary for situations where the JSON-RPC clients aren't - /// trusted. If you control all the requests that are sent out and don't want them - /// to fail, feel free to pass `u32::max_value()`. - /// - /// Default is 128. - pub fn max_pending_requests(mut self, max_pending_requests: NonZeroU32) -> Self { - self.max_pending_requests = max_pending_requests; - self - } - - /// Maximum number of active subscriptions before new ones are automatically - /// rejected. Any JSON-RPC request that causes the server to generate notifications - /// counts as a subscription. - /// - /// Default is 1024. - pub fn max_subscriptions(mut self, max_subscriptions: u32) -> Self { - self.max_subscriptions = max_subscriptions; - self - } - - /// If the chain spec defines a parachain, contains the list of relay chains to choose - /// from. Ignored if not a parachain. - /// - /// This field is necessary because multiple different chain can have the same identity. - /// - /// For example: if user A adds a chain named "Kusama", then user B adds a different chain - /// also named "Kusama", then user B adds a parachain whose relay chain is "Kusama", it would - /// be wrong to connect to the "Kusama" created by user A. - pub fn potential_relay_chains( - mut self, - potential_relay_chains: impl IntoIterator, - ) -> Self { - self.potential_relay_chains = Some(potential_relay_chains.into_iter().collect()); - self - } - - /// Build the light client with specified URL to connect to. - /// You must provide the port number in the URL. - /// - /// ## Panics - /// - /// The panic behaviour depends on the feature flag being used: - /// - /// ### Native - /// - /// Panics when called outside of a `tokio` runtime context. - /// - /// ### Web - /// - /// If smoldot panics, then the promise created will be leaked. For more details, see - /// https://docs.rs/wasm-bindgen-futures/latest/wasm_bindgen_futures/fn.future_to_promise.html. - #[cfg(feature = "jsonrpsee")] - #[cfg_attr(docsrs, doc(cfg(feature = "jsonrpsee")))] - pub async fn build_from_url>(self, url: Url) -> Result, Error> { - validate_url_is_secure(url.as_ref())?; - self.build_from_insecure_url(url).await - } - - /// Build the light client with specified URL to connect to. Allows insecure URLs (no SSL, ws:// or http://). - /// - /// For secure connections only, please use [`crate::LightClientBuilder::build_from_url`]. - #[cfg(feature = "jsonrpsee")] - pub async fn build_from_insecure_url>( - self, - url: Url, - ) -> Result, Error> { - let chain_spec = fetch_url(url.as_ref()).await?; - self.build_client(chain_spec).await - } - - /// Build the light client from chain spec. - /// - /// The most important field of the configuration is the chain specification. - /// This is a JSON document containing all the information necessary for the client to - /// connect to said chain. - /// - /// The chain spec must be obtained from a trusted entity. - /// - /// It can be fetched from a trusted node with the following command: - /// ```bash - /// curl -H "Content-Type: application/json" -d '{"id":1, "jsonrpc":"2.0", "method": "sync_state_genSyncSpec", "params":[true]}' http://localhost:9944/ | jq .result > res.spec - /// ``` - /// - /// # Note - /// - /// For testing environments, please populate the "bootNodes" if the not already provided. - /// See [`Self::bootnodes`] for more details. - /// - /// ## Panics - /// - /// The panic behaviour depends on the feature flag being used: - /// - /// ### Native - /// - /// Panics when called outside of a `tokio` runtime context. - /// - /// ### Web - /// - /// If smoldot panics, then the promise created will be leaked. For more details, see - /// https://docs.rs/wasm-bindgen-futures/latest/wasm_bindgen_futures/fn.future_to_promise.html. - pub async fn build(self, chain_spec: &str) -> Result, Error> { - let chain_spec = serde_json::from_str(chain_spec) - .map_err(|_| Error::LightClient(LightClientError::InvalidChainSpec))?; - - self.build_client(chain_spec).await - } - - /// Build the light client. - async fn build_client( - self, - mut chain_spec: serde_json::Value, - ) -> Result, Error> { - // Set custom bootnodes if provided. - if let Some(bootnodes) = self.bootnodes { - if let serde_json::Value::Object(map) = &mut chain_spec { - map.insert("bootNodes".to_string(), serde_json::Value::Array(bootnodes)); - } - } - - let config = smoldot::AddChainConfig { - specification: &chain_spec.to_string(), - json_rpc: smoldot::AddChainConfigJsonRpc::Enabled { - max_pending_requests: self.max_pending_requests, - max_subscriptions: self.max_subscriptions, - }, - potential_relay_chains: self.potential_relay_chains.unwrap_or_default().into_iter(), - database_content: "", - user_data: (), - }; - - let raw_rpc = LightClientRpc::new(config)?; - build_client_from_rpc(raw_rpc).await - } -} - -/// Raw builder for [`RawLightClient`]. -#[derive(Default)] -pub struct RawLightClientBuilder { - chains: Vec, -} - -impl RawLightClientBuilder { - /// Create a new [`RawLightClientBuilder`]. - pub fn new() -> RawLightClientBuilder { - RawLightClientBuilder::default() - } - - /// Adds a new chain to the list of chains synchronized by the light client. - pub fn add_chain( - mut self, - chain_id: smoldot::ChainId, - rpc_responses: smoldot::JsonRpcResponses, - ) -> Self { - self.chains.push(AddedChain { - chain_id, - rpc_responses, - }); - self - } - - /// Construct a [`RawLightClient`] from a raw smoldot client. - /// - /// The provided `chain_id` is the chain with which the current instance of light client will interact. - /// To target a different chain call the [`LightClient::target_chain`] method. - pub async fn build( - self, - client: smoldot::Client, - ) -> Result { - // The raw subxt light client that spawns the smoldot background task. - let raw_rpc: subxt_lightclient::RawLightClientRpc = - subxt_lightclient::LightClientRpc::new_from_client(client, self.chains.into_iter()); - - // The crate implementation of `RpcClientT` over the raw subxt light client. - let raw_rpc = crate::client::light_client::rpc::RawLightClientRpc::from_inner(raw_rpc); - - Ok(RawLightClient { raw_rpc }) - } -} - -/// Build the light client from a raw rpc client. -async fn build_client_from_rpc( - raw_rpc: LightClientRpc, -) -> Result, Error> { - let chain_id = raw_rpc.chain_id(); - let rpc_client = RpcClient::new(raw_rpc); - let client = OnlineClient::::from_rpc_client(rpc_client).await?; - - Ok(LightClient { client, chain_id }) -} - -/// Fetch the chain spec from the URL. -#[cfg(feature = "jsonrpsee")] -async fn fetch_url(url: impl AsRef) -> Result { - use jsonrpsee::core::client::{ClientT, SubscriptionClientT}; - use jsonrpsee::rpc_params; - use serde_json::value::RawValue; - - let client = jsonrpsee_helpers::client(url.as_ref()).await?; - - let result = client - .request("sync_state_genSyncSpec", jsonrpsee::rpc_params![true]) - .await - .map_err(|err| Error::Rpc(crate::error::RpcError::ClientError(Box::new(err))))?; - - // Subscribe to the finalized heads of the chain. - let mut subscription = SubscriptionClientT::subscribe::, _>( - &client, - "chain_subscribeFinalizedHeads", - rpc_params![], - "chain_unsubscribeFinalizedHeads", - ) - .await - .map_err(|err| Error::Rpc(crate::error::RpcError::ClientError(Box::new(err))))?; - - // We must ensure that the finalized block of the chain is not the block included - // in the chainSpec. - // This is a temporary workaround for: https://github.com/smol-dot/smoldot/issues/1562. - // The first finalized block that is received might by the finalized block could be the one - // included in the chainSpec. Decoding the chainSpec for this purpose is too complex. - let _ = subscription.next().await; - let _ = subscription.next().await; - - Ok(result) -} - -cfg_jsonrpsee_native! { - mod jsonrpsee_helpers { - use crate::error::{Error, LightClientError}; - use tokio_util::compat::Compat; - - pub use jsonrpsee::{ - client_transport::ws::{self, EitherStream, Url, WsTransportClientBuilder}, - core::client::Client, - }; - - pub type Sender = ws::Sender>; - pub type Receiver = ws::Receiver>; - - /// Build WS RPC client from URL - pub async fn client(url: &str) -> Result { - let url = Url::parse(url).map_err(|_| Error::LightClient(LightClientError::InvalidUrl))?; - - if url.scheme() != "ws" && url.scheme() != "wss" { - return Err(Error::LightClient(LightClientError::InvalidScheme)); - } - - let (sender, receiver) = ws_transport(url).await?; - - Ok(Client::builder() - .max_buffer_capacity_per_subscription(4096) - .build_with_tokio(sender, receiver)) - } - - async fn ws_transport(url: Url) -> Result<(Sender, Receiver), Error> { - WsTransportClientBuilder::default() - .build(url) - .await - .map_err(|_| Error::LightClient(LightClientError::Handshake)) - } - } -} - -cfg_jsonrpsee_web! { - mod jsonrpsee_helpers { - use crate::error::{Error, LightClientError}; - pub use jsonrpsee::{ - client_transport::web, - core::client::{Client, ClientBuilder}, - }; - - /// Build web RPC client from URL - pub async fn client(url: &str) -> Result { - let (sender, receiver) = web::connect(url) - .await - .map_err(|_| Error::LightClient(LightClientError::Handshake))?; - - Ok(ClientBuilder::default() - .max_buffer_capacity_per_subscription(4096) - .build_with_wasm(sender, receiver)) - } - } -} diff --git a/subxt/src/client/light_client/rpc.rs b/subxt/src/client/light_client/rpc.rs deleted file mode 100644 index ea9fe996ba..0000000000 --- a/subxt/src/client/light_client/rpc.rs +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. -// This file is dual-licensed as Apache-2.0 or GPL-3.0. -// see LICENSE for license details. - -use super::{smoldot, LightClientError}; -use crate::{ - backend::rpc::{RawRpcFuture, RawRpcSubscription, RpcClientT}, - error::{Error, RpcError}, -}; -use futures::StreamExt; -use serde_json::value::RawValue; -use tokio_stream::wrappers::UnboundedReceiverStream; - -pub const LOG_TARGET: &str = "subxt-rpc-light-client"; - -/// The raw light-client RPC implementation that is used to connect with the chain. -#[derive(Clone)] -pub struct RawLightClientRpc(subxt_lightclient::RawLightClientRpc); - -impl RawLightClientRpc { - /// Constructs a new [`RawLightClientRpc`] from a low level [`subxt_lightclient::RawLightClientRpc`]. - pub fn from_inner(client: subxt_lightclient::RawLightClientRpc) -> RawLightClientRpc { - RawLightClientRpc(client) - } - - /// Constructs a new [`LightClientRpc`] that communicates with the provided chain. - pub fn for_chain(&self, chain_id: smoldot::ChainId) -> LightClientRpc { - LightClientRpc(self.0.for_chain(chain_id)) - } -} - -/// The light-client RPC implementation that is used to connect with the chain. -#[derive(Clone)] -pub struct LightClientRpc(subxt_lightclient::LightClientRpc); - -impl LightClientRpc { - /// Constructs a new [`LightClientRpc`], providing the chain specification. - /// - /// The chain specification can be downloaded from a trusted network via - /// the `sync_state_genSyncSpec` RPC method. This parameter expects the - /// chain spec in text format (ie not in hex-encoded scale-encoded as RPC methods - /// will provide). - /// - /// ## Panics - /// - /// The panic behaviour depends on the feature flag being used: - /// - /// ### Native - /// - /// Panics when called outside of a `tokio` runtime context. - /// - /// ### Web - /// - /// If smoldot panics, then the promise created will be leaked. For more details, see - /// https://docs.rs/wasm-bindgen-futures/latest/wasm_bindgen_futures/fn.future_to_promise.html. - pub fn new( - config: smoldot::AddChainConfig<'_, (), impl Iterator>, - ) -> Result { - let rpc = subxt_lightclient::LightClientRpc::new(config).map_err(LightClientError::Rpc)?; - - Ok(LightClientRpc(rpc)) - } - - /// Returns the chain ID of the current light-client. - pub fn chain_id(&self) -> smoldot::ChainId { - self.0.chain_id() - } -} - -impl RpcClientT for LightClientRpc { - fn request_raw<'a>( - &'a self, - method: &'a str, - params: Option>, - ) -> RawRpcFuture<'a, Box> { - let client = self.clone(); - let chain_id = self.chain_id(); - - Box::pin(async move { - let params = match params { - Some(params) => serde_json::to_string(¶ms).map_err(|_| { - RpcError::ClientError(Box::new(LightClientError::InvalidParams)) - })?, - None => "[]".into(), - }; - - // Fails if the background is closed. - let rx = client - .0 - .method_request(method.to_string(), params) - .map_err(|_| RpcError::ClientError(Box::new(LightClientError::BackgroundClosed)))?; - - // Fails if the background is closed. - let response = rx - .await - .map_err(|_| RpcError::ClientError(Box::new(LightClientError::BackgroundClosed)))?; - - tracing::trace!(target: LOG_TARGET, "RPC response={:?} chain={:?}", response, chain_id); - - response.map_err(|err| RpcError::ClientError(Box::new(err))) - }) - } - - fn subscribe_raw<'a>( - &'a self, - sub: &'a str, - params: Option>, - unsub: &'a str, - ) -> RawRpcFuture<'a, RawRpcSubscription> { - let client = self.clone(); - let chain_id = self.chain_id(); - - Box::pin(async move { - tracing::trace!( - target: LOG_TARGET, - "Subscribe to {:?} with params {:?} chain={:?}", - sub, - params, - chain_id, - ); - - let params = match params { - Some(params) => serde_json::to_string(¶ms).map_err(|_| { - RpcError::ClientError(Box::new(LightClientError::InvalidParams)) - })?, - None => "[]".into(), - }; - - // Fails if the background is closed. - let (sub_id, notif) = client - .0 - .subscription_request(sub.to_string(), params, unsub.to_string()) - .map_err(|_| RpcError::ClientError(Box::new(LightClientError::BackgroundClosed)))?; - - // Fails if the background is closed. - let result = sub_id - .await - .map_err(|_| RpcError::ClientError(Box::new(LightClientError::BackgroundClosed)))? - .map_err(|err| { - RpcError::ClientError(Box::new(LightClientError::Rpc( - subxt_lightclient::LightClientRpcError::Request(err.to_string()), - ))) - })?; - - let sub_id = result - .get() - .trim_start_matches('"') - .trim_end_matches('"') - .to_string(); - tracing::trace!(target: LOG_TARGET, "Received subscription={} chain={:?}", sub_id, chain_id); - - let stream = UnboundedReceiverStream::new(notif); - - let rpc_subscription = RawRpcSubscription { - stream: Box::pin(stream.map(Ok)), - id: Some(sub_id), - }; - - Ok(rpc_subscription) - }) - } -} diff --git a/subxt/src/client/mod.rs b/subxt/src/client/mod.rs index c764af4b59..fe699c4a55 100644 --- a/subxt/src/client/mod.rs +++ b/subxt/src/client/mod.rs @@ -11,14 +11,6 @@ mod offline_client; mod online_client; -crate::macros::cfg_unstable_light_client! { - mod light_client; - - pub use light_client::{ - LightClient, LightClientBuilder, LightClientError, RawLightClient, RawLightClientBuilder, - }; -} - pub use offline_client::{OfflineClient, OfflineClientT}; pub use online_client::{ ClientRuntimeUpdater, OnlineClient, OnlineClientT, RuntimeUpdaterStream, Update, UpgradeError, diff --git a/subxt/src/client/online_client.rs b/subxt/src/client/online_client.rs index f4e2f8c723..1d38016e06 100644 --- a/subxt/src/client/online_client.rs +++ b/subxt/src/client/online_client.rs @@ -76,7 +76,7 @@ impl OnlineClient { /// Allows insecure URLs without SSL encryption, e.g. (http:// and ws:// URLs). pub async fn from_insecure_url(url: impl AsRef) -> Result, Error> { let client = RpcClient::from_insecure_url(url).await?; - let backend = LegacyBackend::new(client); + let backend = LegacyBackend::builder().build(client); OnlineClient::from_backend(Arc::new(backend)).await } } @@ -84,8 +84,11 @@ impl OnlineClient { impl OnlineClient { /// Construct a new [`OnlineClient`] by providing an [`RpcClient`] to drive the connection. /// This will use the current default [`Backend`], which may change in future releases. - pub async fn from_rpc_client(rpc_client: RpcClient) -> Result, Error> { - let backend = Arc::new(LegacyBackend::new(rpc_client)); + pub async fn from_rpc_client( + rpc_client: impl Into, + ) -> Result, Error> { + let rpc_client = rpc_client.into(); + let backend = Arc::new(LegacyBackend::builder().build(rpc_client)); OnlineClient::from_backend(backend).await } @@ -106,9 +109,10 @@ impl OnlineClient { genesis_hash: T::Hash, runtime_version: RuntimeVersion, metadata: impl Into, - rpc_client: RpcClient, + rpc_client: impl Into, ) -> Result, Error> { - let backend = Arc::new(LegacyBackend::new(rpc_client)); + let rpc_client = rpc_client.into(); + let backend = Arc::new(LegacyBackend::builder().build(rpc_client)); OnlineClient::from_backend_with(genesis_hash, runtime_version, metadata, backend) } diff --git a/subxt/src/config/default_extrinsic_params.rs b/subxt/src/config/default_extrinsic_params.rs index dce83853bf..1ed66c34fb 100644 --- a/subxt/src/config/default_extrinsic_params.rs +++ b/subxt/src/config/default_extrinsic_params.rs @@ -2,6 +2,7 @@ // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. +use super::signed_extensions::CheckNonceParams; use super::{signed_extensions, ExtrinsicParams}; use super::{Config, Header}; @@ -20,12 +21,14 @@ pub type DefaultExtrinsicParams = signed_extensions::AnyOf< ), >; -/// A builder that outputs the set of [`super::ExtrinsicParams::OtherParams`] required for +/// A builder that outputs the set of [`super::ExtrinsicParams::Params`] required for /// [`DefaultExtrinsicParams`]. This may expose methods that aren't applicable to the current /// chain; such values will simply be ignored if so. pub struct DefaultExtrinsicParamsBuilder { /// `None` means the tx will be immortal. mortality: Option>, + /// `None` means the nonce will be automatically set. + nonce: Option, /// `None` means we'll use the native token. tip_of_asset_id: Option, tip: u128, @@ -49,6 +52,7 @@ impl Default for DefaultExtrinsicParamsBuilder { tip: 0, tip_of: 0, tip_of_asset_id: None, + nonce: None, } } } @@ -72,6 +76,12 @@ impl DefaultExtrinsicParamsBuilder { self } + /// Provide a specific nonce for the submitter of the extrinsic + pub fn nonce(mut self, nonce: u64) -> Self { + self.nonce = Some(nonce); + self + } + /// Make the transaction mortal, given a block number and block hash (which must both point to /// the same block) that it should be mortal from, and the number of blocks (roughly; it'll be /// rounded to a power of two) that it will be mortal for. @@ -111,7 +121,7 @@ impl DefaultExtrinsicParamsBuilder { } /// Build the extrinsic parameters. - pub fn build(self) -> as ExtrinsicParams>::OtherParams { + pub fn build(self) -> as ExtrinsicParams>::Params { let check_mortality_params = if let Some(mortality) = self.mortality { signed_extensions::CheckMortalityParams::mortal( mortality.period, @@ -131,10 +141,12 @@ impl DefaultExtrinsicParamsBuilder { let charge_transaction_params = signed_extensions::ChargeTransactionPaymentParams::tip(self.tip); + let check_nonce_params = CheckNonceParams(self.nonce); + ( (), (), - (), + check_nonce_params, (), check_mortality_params, charge_asset_tx_params, diff --git a/subxt/src/config/extrinsic_params.rs b/subxt/src/config/extrinsic_params.rs index 42f3b620af..5b3148c269 100644 --- a/subxt/src/config/extrinsic_params.rs +++ b/subxt/src/config/extrinsic_params.rs @@ -10,6 +10,8 @@ use crate::{client::OfflineClientT, Config}; use core::fmt::Debug; +use super::refine_params::RefineParams; + /// An error that can be emitted when trying to construct an instance of [`ExtrinsicParams`], /// encode data from the instance, or match on signed extensions. #[derive(thiserror::Error, Debug)] @@ -53,13 +55,12 @@ pub trait ExtrinsicParams: ExtrinsicParamsEncoder + Sized + 'static { /// These parameters can be provided to the constructor along with /// some default parameters that `subxt` understands, in order to /// help construct your [`ExtrinsicParams`] object. - type OtherParams; + type Params: RefineParams; /// Construct a new instance of our [`ExtrinsicParams`]. fn new>( - nonce: u64, client: Client, - other_params: Self::OtherParams, + params: Self::Params, ) -> Result; } diff --git a/subxt/src/config/mod.rs b/subxt/src/config/mod.rs index ddfa2466c7..ca84a4e9bb 100644 --- a/subxt/src/config/mod.rs +++ b/subxt/src/config/mod.rs @@ -10,6 +10,7 @@ mod default_extrinsic_params; mod extrinsic_params; +mod refine_params; pub mod polkadot; pub mod signed_extensions; @@ -25,6 +26,7 @@ use serde::{de::DeserializeOwned, Serialize}; pub use default_extrinsic_params::{DefaultExtrinsicParams, DefaultExtrinsicParamsBuilder}; pub use extrinsic_params::{ExtrinsicParams, ExtrinsicParamsEncoder, ExtrinsicParamsError}; pub use polkadot::{PolkadotConfig, PolkadotExtrinsicParams, PolkadotExtrinsicParamsBuilder}; +pub use refine_params::{RefineParams, RefineParamsData}; pub use signed_extensions::SignedExtension; pub use substrate::{SubstrateConfig, SubstrateExtrinsicParams, SubstrateExtrinsicParamsBuilder}; @@ -60,7 +62,7 @@ pub trait Config: Sized + Send + Sync + 'static { } /// given some [`Config`], this return the other params needed for its `ExtrinsicParams`. -pub type OtherParamsFor = <::ExtrinsicParams as ExtrinsicParams>::OtherParams; +pub type ParamsFor = <::ExtrinsicParams as ExtrinsicParams>::Params; /// Block hashes must conform to a bunch of things to be used in Subxt. pub trait BlockHash: diff --git a/subxt/src/config/refine_params.rs b/subxt/src/config/refine_params.rs new file mode 100644 index 0000000000..3a5c3a2087 --- /dev/null +++ b/subxt/src/config/refine_params.rs @@ -0,0 +1,85 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + +//! Refining params with values fetched from the chain + +use crate::Config; + +/// Data that can be used to refine the params of signed extensions. +pub struct RefineParamsData { + account_nonce: u64, + block_number: u64, + block_hash: T::Hash, +} + +impl RefineParamsData { + pub(crate) fn new(account_nonce: u64, block_number: u64, block_hash: T::Hash) -> Self { + RefineParamsData { + account_nonce, + block_number, + block_hash, + } + } + + /// account nonce for extrinsic author + pub fn account_nonce(&self) -> u64 { + self.account_nonce + } + + /// latest finalized block number + pub fn block_number(&self) -> u64 { + self.block_number + } + + /// latest finalized block hash + pub fn block_hash(&self) -> T::Hash { + self.block_hash + } +} + +/// Types implementing [`RefineParams`] can be modified to reflect live information from the chain. +pub trait RefineParams { + /// Refine params to an extrinsic. There is usually some notion of 'the param is already set/unset' in types implementing this trait. + /// The refinement should most likely not affect cases where a param is in a 'is already set by the user' state. + fn refine(&mut self, _data: &RefineParamsData) {} +} + +impl RefineParams for () {} + +macro_rules! impl_tuples { + ($($ident:ident $index:tt),+) => { + + impl ),+> RefineParams for ($($ident,)+){ + fn refine(&mut self, data: &RefineParamsData) { + $(self.$index.refine(data);)+ + } + + } + } +} + +#[rustfmt::skip] +const _: () = { + impl_tuples!(A 0); + impl_tuples!(A 0, B 1); + impl_tuples!(A 0, B 1, C 2); + impl_tuples!(A 0, B 1, C 2, D 3); + impl_tuples!(A 0, B 1, C 2, D 3, E 4); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6, H 7); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6, H 7, I 8); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6, H 7, I 8, J 9); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6, H 7, I 8, J 9, K 10); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6, H 7, I 8, J 9, K 10, L 11); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6, H 7, I 8, J 9, K 10, L 11, M 12); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6, H 7, I 8, J 9, K 10, L 11, M 12, N 13); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6, H 7, I 8, J 9, K 10, L 11, M 12, N 13, O 14); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6, H 7, I 8, J 9, K 10, L 11, M 12, N 13, O 14, P 15); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6, H 7, I 8, J 9, K 10, L 11, M 12, N 13, O 14, P 15, Q 16); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6, H 7, I 8, J 9, K 10, L 11, M 12, N 13, O 14, P 15, Q 16, R 17); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6, H 7, I 8, J 9, K 10, L 11, M 12, N 13, O 14, P 15, Q 16, R 17, S 18); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6, H 7, I 8, J 9, K 10, L 11, M 12, N 13, O 14, P 15, Q 16, R 17, S 18, U 19); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6, H 7, I 8, J 9, K 10, L 11, M 12, N 13, O 14, P 15, Q 16, R 17, S 18, U 19, V 20); +}; diff --git a/subxt/src/config/signed_extensions.rs b/subxt/src/config/signed_extensions.rs index f0864cee61..d5d2a1c66b 100644 --- a/subxt/src/config/signed_extensions.rs +++ b/subxt/src/config/signed_extensions.rs @@ -8,6 +8,8 @@ //! when interacting with a chain. use super::extrinsic_params::{ExtrinsicParams, ExtrinsicParamsEncoder, ExtrinsicParamsError}; +use super::refine_params::RefineParamsData; +use super::RefineParams; use crate::utils::Era; use crate::{client::OfflineClientT, Config}; use codec::{Compact, Encode}; @@ -37,12 +39,11 @@ pub trait SignedExtension: ExtrinsicParams { pub struct CheckSpecVersion(u32); impl ExtrinsicParams for CheckSpecVersion { - type OtherParams = (); + type Params = (); fn new>( - _nonce: u64, client: Client, - _other_params: Self::OtherParams, + _params: Self::Params, ) -> Result { Ok(CheckSpecVersion(client.runtime_version().spec_version)) } @@ -65,13 +66,14 @@ impl SignedExtension for CheckSpecVersion { pub struct CheckNonce(Compact); impl ExtrinsicParams for CheckNonce { - type OtherParams = (); + type Params = CheckNonceParams; fn new>( - nonce: u64, _client: Client, - _other_params: Self::OtherParams, + params: Self::Params, ) -> Result { + // If no nonce is set (nor by user nor refinement), use a nonce of 0. + let nonce = params.0.unwrap_or(0); Ok(CheckNonce(Compact(nonce))) } } @@ -89,16 +91,27 @@ impl SignedExtension for CheckNonce { } } +/// Params for [`CheckNonce`] +#[derive(Debug, Clone, Default)] +pub struct CheckNonceParams(pub Option); + +impl RefineParams for CheckNonceParams { + fn refine(&mut self, data: &RefineParamsData) { + if self.0.is_none() { + self.0 = Some(data.account_nonce()); + } + } +} + /// The [`CheckTxVersion`] signed extension. pub struct CheckTxVersion(u32); impl ExtrinsicParams for CheckTxVersion { - type OtherParams = (); + type Params = (); fn new>( - _nonce: u64, client: Client, - _other_params: Self::OtherParams, + _params: Self::Params, ) -> Result { Ok(CheckTxVersion(client.runtime_version().transaction_version)) } @@ -121,12 +134,11 @@ impl SignedExtension for CheckTxVersion { pub struct CheckGenesis(T::Hash); impl ExtrinsicParams for CheckGenesis { - type OtherParams = (); + type Params = (); fn new>( - _nonce: u64, client: Client, - _other_params: Self::OtherParams, + _params: Self::Params, ) -> Result { Ok(CheckGenesis(client.genesis_hash())) } @@ -152,16 +164,25 @@ pub struct CheckMortality { } /// Parameters to configure the [`CheckMortality`] signed extension. -pub struct CheckMortalityParams { +pub struct CheckMortalityParams(Option>); +struct CheckMortalityParamsInner { era: Era, checkpoint: Option, } impl Default for CheckMortalityParams { fn default() -> Self { - Self { - era: Default::default(), - checkpoint: Default::default(), + CheckMortalityParams(None) + } +} + +impl RefineParams for CheckMortalityParams { + fn refine(&mut self, data: &RefineParamsData) { + if self.0.is_none() { + // By default we refine the params to have a mortal transaction valid for 32 blocks. + const TX_VALID_FOR: u64 = 32; + *self = + CheckMortalityParams::mortal(TX_VALID_FOR, data.block_number(), data.block_hash()); } } } @@ -172,32 +193,39 @@ impl CheckMortalityParams { /// `block_hash` should both point to the same block, and are the block that /// the transaction is mortal from. pub fn mortal(period: u64, block_number: u64, block_hash: T::Hash) -> Self { - CheckMortalityParams { + Self(Some(CheckMortalityParamsInner { era: Era::mortal(period, block_number), checkpoint: Some(block_hash), - } + })) } /// An immortal transaction. pub fn immortal() -> Self { - CheckMortalityParams { + Self(Some(CheckMortalityParamsInner { era: Era::Immortal, checkpoint: None, - } + })) } } impl ExtrinsicParams for CheckMortality { - type OtherParams = CheckMortalityParams; + type Params = CheckMortalityParams; fn new>( - _nonce: u64, client: Client, - other_params: Self::OtherParams, + params: Self::Params, ) -> Result { - Ok(CheckMortality { - era: other_params.era, - checkpoint: other_params.checkpoint.unwrap_or(client.genesis_hash()), - }) + let check_mortality = if let Some(params) = params.0 { + CheckMortality { + era: params.era, + checkpoint: params.checkpoint.unwrap_or(client.genesis_hash()), + } + } else { + CheckMortality { + era: Era::Immortal, + checkpoint: client.genesis_hash(), + } + }; + Ok(check_mortality) } } @@ -278,20 +306,21 @@ impl ChargeAssetTxPaymentParams { } impl ExtrinsicParams for ChargeAssetTxPayment { - type OtherParams = ChargeAssetTxPaymentParams; + type Params = ChargeAssetTxPaymentParams; fn new>( - _nonce: u64, _client: Client, - other_params: Self::OtherParams, + params: Self::Params, ) -> Result { Ok(ChargeAssetTxPayment { - tip: Compact(other_params.tip), - asset_id: other_params.asset_id, + tip: Compact(params.tip), + asset_id: params.asset_id, }) } } +impl RefineParams for ChargeAssetTxPaymentParams {} + impl ExtrinsicParamsEncoder for ChargeAssetTxPayment { fn encode_extra_to(&self, v: &mut Vec) { (self.tip, &self.asset_id).encode_to(v); @@ -336,19 +365,20 @@ impl ChargeTransactionPaymentParams { } impl ExtrinsicParams for ChargeTransactionPayment { - type OtherParams = ChargeTransactionPaymentParams; + type Params = ChargeTransactionPaymentParams; fn new>( - _nonce: u64, _client: Client, - other_params: Self::OtherParams, + params: Self::Params, ) -> Result { Ok(ChargeTransactionPayment { - tip: Compact(other_params.tip), + tip: Compact(params.tip), }) } } +impl RefineParams for ChargeTransactionPaymentParams {} + impl ExtrinsicParamsEncoder for ChargeTransactionPayment { fn encode_extra_to(&self, v: &mut Vec) { self.tip.encode_to(v); @@ -380,12 +410,11 @@ macro_rules! impl_tuples { T: Config, $($ident: SignedExtension,)+ { - type OtherParams = ($($ident::OtherParams,)+); + type Params = ($($ident::Params,)+); fn new>( - nonce: u64, client: Client, - other_params: Self::OtherParams, + params: Self::Params, ) -> Result { let metadata = client.metadata(); let types = metadata.types(); @@ -401,7 +430,7 @@ macro_rules! impl_tuples { } // Break and record as soon as we find a match: if $ident::matches(e.identifier(), e.extra_ty(), types) { - let ext = $ident::new(nonce, client.clone(), other_params.$index)?; + let ext = $ident::new(client.clone(), params.$index)?; let boxed_ext: Box = Box::new(ext); exts_by_index.insert(idx, boxed_ext); break diff --git a/subxt/src/config/substrate.rs b/subxt/src/config/substrate.rs index 44cfcf7b73..1ee3e83c5f 100644 --- a/subxt/src/config/substrate.rs +++ b/subxt/src/config/substrate.rs @@ -42,7 +42,7 @@ pub struct BlakeTwo256; impl Hasher for BlakeTwo256 { type Output = H256; fn hash(s: &[u8]) -> Self::Output { - sp_core_hashing::blake2_256(s).into() + sp_crypto_hashing::blake2_256(s).into() } } diff --git a/subxt/src/dynamic.rs b/subxt/src/dynamic.rs index 2801feb683..c405450481 100644 --- a/subxt/src/dynamic.rs +++ b/subxt/src/dynamic.rs @@ -17,7 +17,7 @@ pub use scale_value::{At, Value}; /// regarding what type was used to decode each part of it. This implements /// [`crate::metadata::DecodeWithMetadata`], and is used as a return type /// for dynamic requests. -pub type DecodedValue = scale_value::Value; +pub type DecodedValue = scale_value::Value; // Submit dynamic transactions. pub use crate::tx::dynamic as tx; @@ -68,9 +68,9 @@ impl DecodedValueThunk { } /// Decode the SCALE encoded storage entry into a dynamic [`DecodedValue`] type. pub fn to_value(&self) -> Result { - let val = DecodedValue::decode_as_type( + let val = scale_value::scale::decode_as_type( &mut &*self.scale_bytes, - self.type_id, + &self.type_id, self.metadata.types(), )?; Ok(val) @@ -79,7 +79,7 @@ impl DecodedValueThunk { pub fn as_type(&self) -> Result { T::decode_as_type( &mut &self.scale_bytes[..], - self.type_id, + &self.type_id, self.metadata.types(), ) } diff --git a/subxt/src/error/dispatch_error.rs b/subxt/src/error/dispatch_error.rs index 3f0c54db56..6de0792dc0 100644 --- a/subxt/src/error/dispatch_error.rs +++ b/subxt/src/error/dispatch_error.rs @@ -7,8 +7,9 @@ use crate::metadata::{DecodeWithMetadata, Metadata}; use core::fmt::Debug; -use scale_decode::{visitor::DecodeAsTypeResult, DecodeAsType}; -use std::borrow::Cow; +use scale_decode::{visitor::DecodeAsTypeResult, DecodeAsType, TypeResolver}; + +use std::{borrow::Cow, marker::PhantomData}; use super::{Error, MetadataError}; @@ -209,7 +210,7 @@ impl ModuleError { pub fn as_root_error(&self) -> Result { let decoded = E::decode_as_type( &mut &self.bytes[..], - self.metadata.outer_enums().error_enum_ty(), + &self.metadata.outer_enums().error_enum_ty(), self.metadata.types(), )?; @@ -262,24 +263,27 @@ impl DispatchError { // a legacy format of 2 bytes, or a newer format of 5 bytes. So, just grab the bytes // out when decoding to manually work with them. struct DecodedModuleErrorBytes(Vec); - struct DecodedModuleErrorBytesVisitor; - impl scale_decode::Visitor for DecodedModuleErrorBytesVisitor { + struct DecodedModuleErrorBytesVisitor(PhantomData); + impl scale_decode::Visitor for DecodedModuleErrorBytesVisitor { type Error = scale_decode::Error; type Value<'scale, 'info> = DecodedModuleErrorBytes; + type TypeResolver = R; + fn unchecked_decode_as_type<'scale, 'info>( self, input: &mut &'scale [u8], - _type_id: scale_decode::visitor::TypeId, - _types: &'info scale_info::PortableRegistry, + _type_id: &R::TypeId, + _types: &'info R, ) -> DecodeAsTypeResult, Self::Error>> { DecodeAsTypeResult::Decoded(Ok(DecodedModuleErrorBytes(input.to_vec()))) } } + impl scale_decode::IntoVisitor for DecodedModuleErrorBytes { - type Visitor = DecodedModuleErrorBytesVisitor; - fn into_visitor() -> Self::Visitor { - DecodedModuleErrorBytesVisitor + type AnyVisitor = DecodedModuleErrorBytesVisitor; + fn into_visitor() -> DecodedModuleErrorBytesVisitor { + DecodedModuleErrorBytesVisitor(PhantomData) } } diff --git a/subxt/src/error/mod.rs b/subxt/src/error/mod.rs index 41dbc11d31..c2f5691b63 100644 --- a/subxt/src/error/mod.rs +++ b/subxt/src/error/mod.rs @@ -7,13 +7,14 @@ mod dispatch_error; crate::macros::cfg_unstable_light_client! { - pub use crate::client::LightClientError; + pub use subxt_lightclient::LightClientError; } // Re-export dispatch error types: pub use dispatch_error::{ ArithmeticError, DispatchError, ModuleError, TokenError, TransactionalError, }; +use subxt_metadata::StorageHasher; // Re-expose the errors we use from other crates here: pub use crate::config::ExtrinsicParamsError; @@ -98,6 +99,12 @@ impl From for Error { } } +impl From for Error { + fn from(value: scale_decode::visitor::DecodeError) -> Self { + Error::Decode(value.into()) + } +} + impl Error { /// Checks whether the error was caused by a RPC re-connection. pub fn is_disconnected_will_reconnect(&self) -> bool { @@ -187,14 +194,9 @@ pub enum TransactionError { #[derive(Clone, Debug, thiserror::Error)] #[non_exhaustive] pub enum StorageAddressError { - /// Storage map type must be a composite type. - #[error("Storage map type must be a composite type")] - MapTypeMustBeTuple, /// Storage lookup does not have the expected number of keys. - #[error("Storage lookup requires {expected} keys but got {actual} keys")] - WrongNumberOfKeys { - /// The actual number of keys needed, based on the metadata. - actual: usize, + #[error("Storage lookup requires {expected} keys but more keys have been provided.")] + TooManyKeys { /// The number of keys provided in the storage address. expected: usize, }, @@ -206,6 +208,23 @@ pub enum StorageAddressError { /// The number of fields in the metadata for this storage entry. fields: usize, }, + /// We weren't given enough bytes to decode the storage address/key. + #[error("Not enough remaining bytes to decode the storage address/key")] + NotEnoughBytes, + /// We have leftover bytes after decoding the storage address. + #[error("We have leftover bytes after decoding the storage address")] + TooManyBytes, + /// The bytes of a storage address are not the expected address for decoding the storage keys of the address. + #[error("Storage address bytes are not the expected format. Addresses need to be at least 16 bytes (pallet ++ entry) and follow a structure given by the hashers defined in the metadata")] + UnexpectedAddressBytes, + /// An invalid hasher was used to reconstruct a value from a chunk of bytes that is part of a storage address. Hashers where the hash does not contain the original value are invalid for this purpose. + #[error("An invalid hasher was used to reconstruct a value with type ID {ty_id} from a hash formed by a {hasher:?} hasher. This is only possible for concat-style hashers or the identity hasher")] + HasherCannotReconstructKey { + /// Type id of the key's type. + ty_id: u32, + /// The invalid hasher that caused this error. + hasher: StorageHasher, + }, } /// Something went wrong trying to access details in the metadata. diff --git a/subxt/src/events/events_client.rs b/subxt/src/events/events_client.rs index 834e6cd64f..bb389b828c 100644 --- a/subxt/src/events/events_client.rs +++ b/subxt/src/events/events_client.rs @@ -76,8 +76,8 @@ where // The storage key needed to access events. fn system_events_key() -> [u8; 32] { - let a = sp_core_hashing::twox_128(b"System"); - let b = sp_core_hashing::twox_128(b"Events"); + let a = sp_crypto_hashing::twox_128(b"System"); + let b = sp_crypto_hashing::twox_128(b"Events"); let mut res = [0; 32]; res[0..16].clone_from_slice(&a); res[16..32].clone_from_slice(&b); diff --git a/subxt/src/events/events_type.rs b/subxt/src/events/events_type.rs index 831268ad00..6818a84815 100644 --- a/subxt/src/events/events_type.rs +++ b/subxt/src/events/events_type.rs @@ -228,9 +228,9 @@ impl EventDetails { // Skip over the bytes for this field: scale_decode::visitor::decode_with_visitor( input, - field_metadata.ty.id, + &field_metadata.ty.id, metadata.types(), - scale_decode::visitor::IgnoreVisitor, + scale_decode::visitor::IgnoreVisitor::new(), ) .map_err(scale_decode::Error::from)?; } @@ -321,9 +321,7 @@ impl EventDetails { /// Decode and provide the event fields back in the form of a [`scale_value::Composite`] /// type which represents the named or unnamed fields that were present in the event. - pub fn field_values( - &self, - ) -> Result, Error> { + pub fn field_values(&self) -> Result, Error> { let bytes = &mut self.field_bytes(); let event_metadata = self.event_metadata(); @@ -331,14 +329,10 @@ impl EventDetails { .variant .fields .iter() - .map(|f| scale_decode::Field::new(f.ty.id, f.name.as_deref())); + .map(|f| scale_decode::Field::new(&f.ty.id, f.name.as_deref())); - use scale_decode::DecodeAsFields; - let decoded = >::decode_as_fields( - bytes, - &mut fields, - self.metadata.types(), - )?; + let decoded = + scale_value::scale::decode_as_fields(bytes, &mut fields, self.metadata.types())?; Ok(decoded) } @@ -352,7 +346,7 @@ impl EventDetails { .variant .fields .iter() - .map(|f| scale_decode::Field::new(f.ty.id, f.name.as_deref())); + .map(|f| scale_decode::Field::new(&f.ty.id, f.name.as_deref())); let decoded = E::decode_as_fields(&mut self.field_bytes(), &mut fields, self.metadata.types())?; Ok(Some(decoded)) @@ -369,7 +363,7 @@ impl EventDetails { let decoded = E::decode_as_type( &mut &bytes[..], - self.metadata.outer_enums().event_enum_ty(), + &self.metadata.outer_enums().event_enum_ty(), self.metadata.types(), )?; diff --git a/subxt/src/lib.rs b/subxt/src/lib.rs index b50880e1ea..f8eb443eb3 100644 --- a/subxt/src/lib.rs +++ b/subxt/src/lib.rs @@ -61,6 +61,11 @@ pub mod utils; #[macro_use] mod macros; +// Expose light client bits +cfg_unstable_light_client! { + pub use subxt_lightclient as lightclient; +} + // Expose a few of the most common types at root, // but leave most types behind their respective modules. pub use crate::{ diff --git a/subxt/src/metadata/decode_encode_traits.rs b/subxt/src/metadata/decode_encode_traits.rs index 81dbaea131..8b8d4077fa 100644 --- a/subxt/src/metadata/decode_encode_traits.rs +++ b/subxt/src/metadata/decode_encode_traits.rs @@ -21,7 +21,7 @@ impl DecodeWithMetadata for T { type_id: u32, metadata: &Metadata, ) -> Result { - let val = T::decode_as_type(bytes, type_id, metadata.types())?; + let val = T::decode_as_type(bytes, &type_id, metadata.types())?; Ok(val) } } @@ -45,7 +45,7 @@ impl EncodeWithMetadata for T { metadata: &Metadata, bytes: &mut Vec, ) -> Result<(), Error> { - self.encode_as_type_to(type_id, metadata.types(), bytes)?; + self.encode_as_type_to(&type_id, metadata.types(), bytes)?; Ok(()) } } diff --git a/subxt/src/runtime_api/runtime_payload.rs b/subxt/src/runtime_api/runtime_payload.rs index ff776eb14f..128440b98d 100644 --- a/subxt/src/runtime_api/runtime_payload.rs +++ b/subxt/src/runtime_api/runtime_payload.rs @@ -103,7 +103,7 @@ impl RuntimeApiPayload .ok_or_else(|| MetadataError::RuntimeMethodNotFound((*self.method_name).to_owned()))?; let mut fields = api_method .inputs() - .map(|input| scale_encode::Field::named(input.ty, &input.name)); + .map(|input| scale_encode::Field::named(&input.ty, &input.name)); self.args_data .encode_as_fields_to(&mut fields, metadata.types(), out)?; diff --git a/subxt/src/storage/mod.rs b/subxt/src/storage/mod.rs index 0219cd8caf..98f8365274 100644 --- a/subxt/src/storage/mod.rs +++ b/subxt/src/storage/mod.rs @@ -6,23 +6,23 @@ mod storage_address; mod storage_client; +mod storage_key; mod storage_type; - -pub mod utils; +mod utils; pub use storage_client::StorageClient; -pub use storage_type::Storage; +pub use storage_type::{Storage, StorageKeyValuePair}; /// Types representing an address which describes where a storage /// entry lives and how to properly decode it. pub mod address { - pub use super::storage_address::{ - dynamic, make_static_storage_map_key, Address, DynamicAddress, StaticStorageMapKey, - StorageAddress, Yes, - }; + pub use super::storage_address::{dynamic, Address, DynamicAddress, StorageAddress, Yes}; + pub use super::storage_key::{StaticStorageKey, StorageKey}; } +pub use storage_key::StorageKey; + // For consistency with other modules, also expose // the basic address stuff at the root of the module. pub use storage_address::{dynamic, Address, DynamicAddress, StorageAddress}; diff --git a/subxt/src/storage/storage_address.rs b/subxt/src/storage/storage_address.rs index 2211b20def..cb72462eb8 100644 --- a/subxt/src/storage/storage_address.rs +++ b/subxt/src/storage/storage_address.rs @@ -4,20 +4,22 @@ use crate::{ dynamic::DecodedValueThunk, - error::{Error, MetadataError, StorageAddressError}, - metadata::{DecodeWithMetadata, EncodeWithMetadata, Metadata}, - utils::{Encoded, Static}, + error::{Error, MetadataError}, + metadata::{DecodeWithMetadata, Metadata}, }; use derivative::Derivative; -use scale_info::TypeDef; + use std::borrow::Cow; -use subxt_metadata::{StorageEntryType, StorageHasher}; + +use super::{storage_key::StorageHashers, StorageKey}; /// This represents a storage address. Anything implementing this trait /// can be used to fetch and iterate over storage entries. pub trait StorageAddress { /// The target type of the value that lives at this address. type Target: DecodeWithMetadata; + /// The keys type used to construct this address. + type Keys: StorageKey; /// Can an entry be fetched from this address? /// Set this type to [`Yes`] to enable the corresponding calls to be made. type IsFetchable; @@ -54,64 +56,69 @@ pub struct Yes; /// via the `subxt` macro) or dynamic values via [`dynamic`]. #[derive(Derivative)] #[derivative( - Clone(bound = "StorageKey: Clone"), - Debug(bound = "StorageKey: std::fmt::Debug"), - Eq(bound = "StorageKey: std::cmp::Eq"), - Ord(bound = "StorageKey: std::cmp::Ord"), - PartialEq(bound = "StorageKey: std::cmp::PartialEq"), - PartialOrd(bound = "StorageKey: std::cmp::PartialOrd") + Clone(bound = "Keys: Clone"), + Debug(bound = "Keys: std::fmt::Debug"), + Eq(bound = "Keys: std::cmp::Eq"), + Ord(bound = "Keys: std::cmp::Ord"), + PartialEq(bound = "Keys: std::cmp::PartialEq"), + PartialOrd(bound = "Keys: std::cmp::PartialOrd") )] -pub struct Address { +pub struct Address { pallet_name: Cow<'static, str>, entry_name: Cow<'static, str>, - storage_entry_keys: Vec, + keys: Keys, validation_hash: Option<[u8; 32]>, _marker: std::marker::PhantomData<(ReturnTy, Fetchable, Defaultable, Iterable)>, } /// A typical storage address constructed at runtime rather than via the `subxt` macro; this /// has no restriction on what it can be used for (since we don't statically know). -pub type DynamicAddress = Address; +pub type DynamicAddress = Address; -impl - Address -where - StorageKey: EncodeWithMetadata, - ReturnTy: DecodeWithMetadata, -{ - /// Create a new [`Address`] to use to access a storage entry. - pub fn new( - pallet_name: impl Into, - entry_name: impl Into, - storage_entry_keys: Vec, - ) -> Self { +impl DynamicAddress { + /// Creates a new dynamic address. As `Keys` you can use a `Vec` + pub fn new(pallet_name: impl Into, entry_name: impl Into, keys: Keys) -> Self { Self { pallet_name: Cow::Owned(pallet_name.into()), entry_name: Cow::Owned(entry_name.into()), - storage_entry_keys: storage_entry_keys.into_iter().collect(), + keys, validation_hash: None, _marker: std::marker::PhantomData, } } +} +impl + Address +where + Keys: StorageKey, + ReturnTy: DecodeWithMetadata, +{ /// Create a new [`Address`] using static strings for the pallet and call name. /// This is only expected to be used from codegen. #[doc(hidden)] pub fn new_static( pallet_name: &'static str, entry_name: &'static str, - storage_entry_keys: Vec, + keys: Keys, hash: [u8; 32], ) -> Self { Self { pallet_name: Cow::Borrowed(pallet_name), entry_name: Cow::Borrowed(entry_name), - storage_entry_keys: storage_entry_keys.into_iter().collect(), + keys, validation_hash: Some(hash), _marker: std::marker::PhantomData, } } +} +impl + Address +where + Keys: StorageKey, + ReturnTy: DecodeWithMetadata, +{ /// Do not validate this storage entry prior to accessing it. pub fn unvalidated(self) -> Self { Self { @@ -128,13 +135,14 @@ where } } -impl StorageAddress - for Address +impl StorageAddress + for Address where - StorageKey: EncodeWithMetadata, + Keys: StorageKey, ReturnTy: DecodeWithMetadata, { type Target = ReturnTy; + type Keys = Keys; type IsFetchable = Fetchable; type IsDefaultable = Defaultable; type IsIterable = Iterable; @@ -156,78 +164,10 @@ where .entry_by_name(self.entry_name()) .ok_or_else(|| MetadataError::StorageEntryNotFound(self.entry_name().to_owned()))?; - match entry.entry_type() { - StorageEntryType::Plain(_) => { - if !self.storage_entry_keys.is_empty() { - Err(StorageAddressError::WrongNumberOfKeys { - expected: 0, - actual: self.storage_entry_keys.len(), - } - .into()) - } else { - Ok(()) - } - } - StorageEntryType::Map { - hashers, key_ty, .. - } => { - let ty = metadata - .types() - .resolve(*key_ty) - .ok_or(MetadataError::TypeNotFound(*key_ty))?; - - // If the provided keys are empty, the storage address must be - // equal to the storage root address. - if self.storage_entry_keys.is_empty() { - return Ok(()); - } - - // If the key is a tuple, we encode each value to the corresponding tuple type. - // If the key is not a tuple, encode a single value to the key type. - let type_ids = match &ty.type_def { - TypeDef::Tuple(tuple) => { - either::Either::Left(tuple.fields.iter().map(|f| f.id)) - } - _other => either::Either::Right(std::iter::once(*key_ty)), - }; - - if type_ids.len() < self.storage_entry_keys.len() { - // Provided more keys than fields. - return Err(StorageAddressError::WrongNumberOfKeys { - expected: type_ids.len(), - actual: self.storage_entry_keys.len(), - } - .into()); - } - - if hashers.len() == 1 { - // One hasher; hash a tuple of all SCALE encoded bytes with the one hash function. - let mut input = Vec::new(); - let iter = self.storage_entry_keys.iter().zip(type_ids); - for (key, type_id) in iter { - key.encode_with_metadata(type_id, metadata, &mut input)?; - } - hash_bytes(&input, &hashers[0], bytes); - Ok(()) - } else if hashers.len() >= type_ids.len() { - let iter = self.storage_entry_keys.iter().zip(type_ids).zip(hashers); - // A hasher per field; encode and hash each field independently. - for ((key, type_id), hasher) in iter { - let mut input = Vec::new(); - key.encode_with_metadata(type_id, metadata, &mut input)?; - hash_bytes(&input, hasher, bytes); - } - Ok(()) - } else { - // Provided more fields than hashers. - Err(StorageAddressError::WrongNumberOfHashers { - hashers: hashers.len(), - fields: type_ids.len(), - } - .into()) - } - } - } + let hashers = StorageHashers::new(entry.entry_type(), metadata.types())?; + self.keys + .encode_storage_key(bytes, &mut hashers.iter(), metadata.types())?; + Ok(()) } fn validation_hash(&self) -> Option<[u8; 32]> { @@ -235,40 +175,11 @@ where } } -/// A static storage key; this is some pre-encoded bytes -/// likely provided by the generated interface. -pub type StaticStorageMapKey = Static; - -// Used in codegen to construct the above. -#[doc(hidden)] -pub fn make_static_storage_map_key(t: T) -> StaticStorageMapKey { - Static(Encoded(t.encode())) -} - /// Construct a new dynamic storage lookup. -pub fn dynamic( +pub fn dynamic( pallet_name: impl Into, entry_name: impl Into, - storage_entry_keys: Vec, -) -> DynamicAddress { + storage_entry_keys: Keys, +) -> DynamicAddress { DynamicAddress::new(pallet_name, entry_name, storage_entry_keys) } - -/// Take some SCALE encoded bytes and a [`StorageHasher`] and hash the bytes accordingly. -fn hash_bytes(input: &[u8], hasher: &StorageHasher, bytes: &mut Vec) { - match hasher { - StorageHasher::Identity => bytes.extend(input), - StorageHasher::Blake2_128 => bytes.extend(sp_core_hashing::blake2_128(input)), - StorageHasher::Blake2_128Concat => { - bytes.extend(sp_core_hashing::blake2_128(input)); - bytes.extend(input); - } - StorageHasher::Blake2_256 => bytes.extend(sp_core_hashing::blake2_256(input)), - StorageHasher::Twox128 => bytes.extend(sp_core_hashing::twox_128(input)), - StorageHasher::Twox256 => bytes.extend(sp_core_hashing::twox_256(input)), - StorageHasher::Twox64Concat => { - bytes.extend(sp_core_hashing::twox_64(input)); - bytes.extend(input); - } - } -} diff --git a/subxt/src/storage/storage_key.rs b/subxt/src/storage/storage_key.rs new file mode 100644 index 0000000000..71ecafde9d --- /dev/null +++ b/subxt/src/storage/storage_key.rs @@ -0,0 +1,472 @@ +use crate::{ + error::{Error, MetadataError, StorageAddressError}, + utils::{Encoded, Static}, +}; +use scale_decode::visitor::IgnoreVisitor; +use scale_encode::EncodeAsType; +use scale_info::{PortableRegistry, TypeDef}; +use scale_value::Value; +use subxt_metadata::{StorageEntryType, StorageHasher}; + +use derivative::Derivative; + +use super::utils::hash_bytes; + +/// A collection of storage hashers paired with the type ids of the types they should hash. +/// Can be created for each storage entry in the metadata via [`StorageHashers::new()`]. +#[derive(Debug)] +pub(crate) struct StorageHashers { + hashers_and_ty_ids: Vec<(StorageHasher, u32)>, +} + +impl StorageHashers { + /// Creates new [`StorageHashers`] from a storage entry. Looks at the [`StorageEntryType`] and + /// assigns a hasher to each type id that makes up the key. + pub fn new(storage_entry: &StorageEntryType, types: &PortableRegistry) -> Result { + let mut hashers_and_ty_ids = vec![]; + if let StorageEntryType::Map { + hashers, key_ty, .. + } = storage_entry + { + let ty = types + .resolve(*key_ty) + .ok_or(MetadataError::TypeNotFound(*key_ty))?; + + if let TypeDef::Tuple(tuple) = &ty.type_def { + if hashers.len() == 1 { + // use the same hasher for all fields, if only 1 hasher present: + let hasher = hashers[0]; + for f in tuple.fields.iter() { + hashers_and_ty_ids.push((hasher, f.id)); + } + } else if hashers.len() < tuple.fields.len() { + return Err(StorageAddressError::WrongNumberOfHashers { + hashers: hashers.len(), + fields: tuple.fields.len(), + } + .into()); + } else { + for (i, f) in tuple.fields.iter().enumerate() { + hashers_and_ty_ids.push((hashers[i], f.id)); + } + } + } else { + if hashers.len() != 1 { + return Err(StorageAddressError::WrongNumberOfHashers { + hashers: hashers.len(), + fields: 1, + } + .into()); + } + hashers_and_ty_ids.push((hashers[0], *key_ty)); + }; + } + + Ok(Self { hashers_and_ty_ids }) + } + + /// Creates an iterator over the storage hashers and type ids. + pub fn iter(&self) -> StorageHashersIter<'_> { + StorageHashersIter { + hashers: self, + idx: 0, + } + } +} + +/// An iterator over all type ids of the key and the respective hashers. +/// See [`StorageHashers::iter()`]. +#[derive(Debug)] +pub struct StorageHashersIter<'a> { + hashers: &'a StorageHashers, + idx: usize, +} + +impl<'a> StorageHashersIter<'a> { + fn next_or_err(&mut self) -> Result<(StorageHasher, u32), Error> { + self.next().ok_or_else(|| { + StorageAddressError::TooManyKeys { + expected: self.hashers.hashers_and_ty_ids.len(), + } + .into() + }) + } +} + +impl<'a> Iterator for StorageHashersIter<'a> { + type Item = (StorageHasher, u32); + + fn next(&mut self) -> Option { + let item = self.hashers.hashers_and_ty_ids.get(self.idx).copied()?; + self.idx += 1; + Some(item) + } +} + +impl<'a> ExactSizeIterator for StorageHashersIter<'a> { + fn len(&self) -> usize { + self.hashers.hashers_and_ty_ids.len() - self.idx + } +} + +/// This trait should be implemented by anything that can be used as one or multiple storage keys. +pub trait StorageKey { + /// Encodes the storage key into some bytes + fn encode_storage_key( + &self, + bytes: &mut Vec, + hashers: &mut StorageHashersIter, + types: &PortableRegistry, + ) -> Result<(), Error>; + + /// Attempts to decode the StorageKey given some bytes and a set of hashers and type IDs that they are meant to represent. + /// The bytes passed to `decode` should start with: + /// - 1. some fixed size hash (for all hashers except `Identity`) + /// - 2. the plain key value itself (for `Identity`, `Blake2_128Concat` and `Twox64Concat` hashers) + fn decode_storage_key( + bytes: &mut &[u8], + hashers: &mut StorageHashersIter, + types: &PortableRegistry, + ) -> Result + where + Self: Sized + 'static; +} + +/// Implement `StorageKey` for `()` which can be used for keyless storage entries, +/// or to otherwise just ignore some entry. +impl StorageKey for () { + fn encode_storage_key( + &self, + _bytes: &mut Vec, + hashers: &mut StorageHashersIter, + _types: &PortableRegistry, + ) -> Result<(), Error> { + _ = hashers.next_or_err(); + Ok(()) + } + + fn decode_storage_key( + bytes: &mut &[u8], + hashers: &mut StorageHashersIter, + types: &PortableRegistry, + ) -> Result { + let (hasher, ty_id) = match hashers.next_or_err() { + Ok((hasher, ty_id)) => (hasher, ty_id), + Err(_) if bytes.is_empty() => return Ok(()), + Err(err) => return Err(err), + }; + consume_hash_returning_key_bytes(bytes, hasher, ty_id, types)?; + Ok(()) + } +} + +/// A storage key for static encoded values. +/// The original value is only present at construction, but can be decoded from the contained bytes. +#[derive(Derivative)] +#[derivative(Clone(bound = ""), Debug(bound = ""))] +pub struct StaticStorageKey { + bytes: Static, + _marker: std::marker::PhantomData, +} + +impl StaticStorageKey { + /// Creates a new static storage key + pub fn new(key: &K) -> Self { + StaticStorageKey { + bytes: Static(Encoded(key.encode())), + _marker: std::marker::PhantomData, + } + } +} + +impl StaticStorageKey { + /// Decodes the encoded inner bytes into the type `K`. + pub fn decoded(&self) -> Result { + let decoded = K::decode(&mut self.bytes())?; + Ok(decoded) + } +} + +impl StaticStorageKey { + /// Returns the scale-encoded bytes that make up this key + pub fn bytes(&self) -> &[u8] { + &self.bytes.0 .0 + } +} + +// Note: The ?Sized bound is necessary to support e.g. `StorageKey<[u8]>`. +impl StorageKey for StaticStorageKey { + fn encode_storage_key( + &self, + bytes: &mut Vec, + hashers: &mut StorageHashersIter, + types: &PortableRegistry, + ) -> Result<(), Error> { + let (hasher, ty_id) = hashers.next_or_err()?; + let encoded_value = self.bytes.encode_as_type(&ty_id, types)?; + hash_bytes(&encoded_value, hasher, bytes); + Ok(()) + } + + fn decode_storage_key( + bytes: &mut &[u8], + hashers: &mut StorageHashersIter, + types: &PortableRegistry, + ) -> Result + where + Self: Sized + 'static, + { + let (hasher, ty_id) = hashers.next_or_err()?; + let key_bytes = consume_hash_returning_key_bytes(bytes, hasher, ty_id, types)?; + + // if the hasher had no key appended, we can't decode it into a `StaticStorageKey`. + let Some(key_bytes) = key_bytes else { + return Err(StorageAddressError::HasherCannotReconstructKey { ty_id, hasher }.into()); + }; + + // Return the key bytes. + let key = StaticStorageKey { + bytes: Static(Encoded(key_bytes.to_vec())), + _marker: std::marker::PhantomData::, + }; + Ok(key) + } +} + +impl StorageKey for Vec { + fn encode_storage_key( + &self, + bytes: &mut Vec, + hashers: &mut StorageHashersIter, + types: &PortableRegistry, + ) -> Result<(), Error> { + for value in self.iter() { + let (hasher, ty_id) = hashers.next_or_err()?; + let encoded_value = value.encode_as_type(&ty_id, types)?; + hash_bytes(&encoded_value, hasher, bytes); + } + Ok(()) + } + + fn decode_storage_key( + bytes: &mut &[u8], + hashers: &mut StorageHashersIter, + types: &PortableRegistry, + ) -> Result + where + Self: Sized + 'static, + { + let mut result: Vec = vec![]; + for (hasher, ty_id) in hashers.by_ref() { + match consume_hash_returning_key_bytes(bytes, hasher, ty_id, types)? { + Some(value_bytes) => { + let value = + scale_value::scale::decode_as_type(&mut &*value_bytes, &ty_id, types)?; + result.push(value.remove_context()); + } + None => { + result.push(Value::unnamed_composite([])); + } + } + } + + // We've consumed all of the hashers, so we expect to also consume all of the bytes: + if !bytes.is_empty() { + return Err(StorageAddressError::TooManyBytes.into()); + } + + Ok(result) + } +} + +// Skip over the hash bytes (including any key at the end), returning bytes +// representing the key if one exists, or None if the hasher has no key appended. +fn consume_hash_returning_key_bytes<'a>( + bytes: &mut &'a [u8], + hasher: StorageHasher, + ty_id: u32, + types: &PortableRegistry, +) -> Result, Error> { + // Strip the bytes off for the actual hash, consuming them. + let bytes_to_strip = hasher.len_excluding_key(); + if bytes.len() < bytes_to_strip { + return Err(StorageAddressError::NotEnoughBytes.into()); + } + *bytes = &bytes[bytes_to_strip..]; + + // Now, find the bytes representing the key, consuming them. + let before_key = *bytes; + if hasher.ends_with_key() { + scale_decode::visitor::decode_with_visitor( + bytes, + &ty_id, + types, + IgnoreVisitor::::new(), + ) + .map_err(|err| Error::Decode(err.into()))?; + // Return the key bytes, having advanced the input cursor past them. + let key_bytes = &before_key[..before_key.len() - bytes.len()]; + + Ok(Some(key_bytes)) + } else { + // There are no key bytes, so return None. + Ok(None) + } +} + +/// Generates StorageKey implementations for tuples +macro_rules! impl_tuples { + ($($ty:ident $n:tt),+) => {{ + impl<$($ty: StorageKey),+> StorageKey for ($( $ty ),+) { + fn encode_storage_key( + &self, + bytes: &mut Vec, + hashers: &mut StorageHashersIter, + types: &PortableRegistry, + ) -> Result<(), Error> { + $( self.$n.encode_storage_key(bytes, hashers, types)?; )+ + Ok(()) + } + + fn decode_storage_key( + bytes: &mut &[u8], + hashers: &mut StorageHashersIter, + types: &PortableRegistry, + ) -> Result + where + Self: Sized + 'static, + { + Ok( ( $( $ty::decode_storage_key(bytes, hashers, types)?, )+ ) ) + } + } + }}; +} + +#[rustfmt::skip] +const _: () = { + impl_tuples!(A 0, B 1); + impl_tuples!(A 0, B 1, C 2); + impl_tuples!(A 0, B 1, C 2, D 3); + impl_tuples!(A 0, B 1, C 2, D 3, E 4); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6); + impl_tuples!(A 0, B 1, C 2, D 3, E 4, F 5, G 6, H 7); +}; + +#[cfg(test)] +mod tests { + + use codec::Encode; + use scale_info::{meta_type, PortableRegistry, Registry, TypeInfo}; + use subxt_metadata::StorageHasher; + + use crate::utils::Era; + + use super::{StaticStorageKey, StorageKey}; + + struct KeyBuilder { + registry: Registry, + bytes: Vec, + hashers_and_ty_ids: Vec<(StorageHasher, u32)>, + } + + impl KeyBuilder { + fn new() -> KeyBuilder { + KeyBuilder { + registry: Registry::new(), + bytes: vec![], + hashers_and_ty_ids: vec![], + } + } + + fn add(mut self, value: T, hasher: StorageHasher) -> Self { + let id = self.registry.register_type(&meta_type::()).id; + + self.hashers_and_ty_ids.push((hasher, id)); + for _i in 0..hasher.len_excluding_key() { + self.bytes.push(0); + } + value.encode_to(&mut self.bytes); + self + } + + fn build(self) -> (PortableRegistry, Vec, Vec<(StorageHasher, u32)>) { + (self.registry.into(), self.bytes, self.hashers_and_ty_ids) + } + } + + #[test] + fn storage_key_decoding_fuzz() { + let hashers = [ + StorageHasher::Blake2_128, + StorageHasher::Blake2_128Concat, + StorageHasher::Blake2_256, + StorageHasher::Identity, + StorageHasher::Twox128, + StorageHasher::Twox256, + StorageHasher::Twox64Concat, + ]; + + let key_preserving_hashers = [ + StorageHasher::Blake2_128Concat, + StorageHasher::Identity, + StorageHasher::Twox64Concat, + ]; + + type T4A = ( + (), + StaticStorageKey, + StaticStorageKey, + StaticStorageKey, + ); + type T4B = ( + (), + (StaticStorageKey, StaticStorageKey), + StaticStorageKey, + ); + type T4C = ( + ((), StaticStorageKey), + (StaticStorageKey, StaticStorageKey), + ); + + let era = Era::Immortal; + for h0 in hashers { + for h1 in key_preserving_hashers { + for h2 in key_preserving_hashers { + for h3 in key_preserving_hashers { + let (types, bytes, hashers_and_ty_ids) = KeyBuilder::new() + .add((), h0) + .add(13u32, h1) + .add("Hello", h2) + .add(era, h3) + .build(); + + let hashers = super::StorageHashers { hashers_and_ty_ids }; + let keys_a = + T4A::decode_storage_key(&mut &bytes[..], &mut hashers.iter(), &types) + .unwrap(); + + let keys_b = + T4B::decode_storage_key(&mut &bytes[..], &mut hashers.iter(), &types) + .unwrap(); + + let keys_c = + T4C::decode_storage_key(&mut &bytes[..], &mut hashers.iter(), &types) + .unwrap(); + + assert_eq!(keys_a.1.decoded().unwrap(), 13); + assert_eq!(keys_b.1 .0.decoded().unwrap(), 13); + assert_eq!(keys_c.0 .1.decoded().unwrap(), 13); + + assert_eq!(keys_a.2.decoded().unwrap(), "Hello"); + assert_eq!(keys_b.1 .1.decoded().unwrap(), "Hello"); + assert_eq!(keys_c.1 .0.decoded().unwrap(), "Hello"); + assert_eq!(keys_a.3.decoded().unwrap(), era); + assert_eq!(keys_b.2.decoded().unwrap(), era); + assert_eq!(keys_c.1 .1.decoded().unwrap(), era); + } + } + } + } + } +} diff --git a/subxt/src/storage/storage_type.rs b/subxt/src/storage/storage_type.rs index 2669c1abce..d072c1e40b 100644 --- a/subxt/src/storage/storage_type.rs +++ b/subxt/src/storage/storage_type.rs @@ -3,18 +3,22 @@ // see LICENSE for license details. use super::storage_address::{StorageAddress, Yes}; +use super::storage_key::StorageHashers; +use super::StorageKey; use crate::{ backend::{BackendExt, BlockRef}, client::OnlineClientT, - error::{Error, MetadataError}, + error::{Error, MetadataError, StorageAddressError}, metadata::{DecodeWithMetadata, Metadata}, Config, }; use codec::Decode; use derivative::Derivative; use futures::StreamExt; + use std::{future::Future, marker::PhantomData}; + use subxt_metadata::{PalletMetadata, StorageEntryMetadata, StorageEntryType}; /// This is returned from a couple of storage functions. @@ -197,18 +201,19 @@ where /// .await /// .unwrap(); /// - /// while let Some(Ok((key, value))) = iter.next().await { - /// println!("Key: 0x{}", hex::encode(&key)); - /// println!("Value: {}", value); + /// while let Some(Ok(kv)) = iter.next().await { + /// println!("Key bytes: 0x{}", hex::encode(&kv.key_bytes)); + /// println!("Value: {}", kv.value); /// } /// # } /// ``` pub fn iter
( &self, address: Address, - ) -> impl Future, Address::Target)>, Error>> + 'static + ) -> impl Future>, Error>> + 'static where Address: StorageAddress + 'static, + Address::Keys: 'static + Sized, { let client = self.client.clone(); let block_ref = self.block_ref.clone(); @@ -226,11 +231,13 @@ where // Look up the return type for flexible decoding. Do this once here to avoid // potentially doing it every iteration if we used `decode_storage_with_metadata` // in the iterator. - let return_type_id = return_type_from_storage_entry_type(entry.entry_type()); + let entry = entry.entry_type(); + + let return_type_id = entry.value_ty(); + let hashers = StorageHashers::new(entry, metadata.types())?; // The address bytes of this entry: let address_bytes = super::utils::storage_address_bytes(&address, &metadata)?; - let s = client .backend() .storage_fetch_descendant_values(address_bytes, block_ref.hash()) @@ -240,12 +247,27 @@ where Ok(kv) => kv, Err(e) => return Err(e), }; - let val = Address::Target::decode_with_metadata( + let value = Address::Target::decode_with_metadata( &mut &*kv.value, return_type_id, &metadata, )?; - Ok((kv.key, val)) + + let key_bytes = kv.key; + let cursor = &mut &key_bytes[..]; + strip_storage_addess_root_bytes(cursor)?; + + let keys = ::decode_storage_key( + cursor, + &mut hashers.iter(), + metadata.types(), + )?; + + Ok(StorageKeyValuePair::
{ + keys, + key_bytes, + value, + }) }); let s = StreamOfResults::new(Box::pin(s)); @@ -265,8 +287,10 @@ where // construct the storage key. This is done similarly in `frame_support::traits::metadata::StorageVersion::storage_key()`. pub const STORAGE_VERSION_STORAGE_KEY_POSTFIX: &[u8] = b":__STORAGE_VERSION__:"; let mut key_bytes: Vec = vec![]; - key_bytes.extend(&sp_core_hashing::twox_128(pallet_name.as_ref().as_bytes())); - key_bytes.extend(&sp_core_hashing::twox_128( + key_bytes.extend(&sp_crypto_hashing::twox_128( + pallet_name.as_ref().as_bytes(), + )); + key_bytes.extend(&sp_crypto_hashing::twox_128( STORAGE_VERSION_STORAGE_KEY_POSTFIX, )); @@ -290,6 +314,28 @@ where } } +/// Strips the first 16 bytes (8 for the pallet hash, 8 for the entry hash) off some storage address bytes. +fn strip_storage_addess_root_bytes(address_bytes: &mut &[u8]) -> Result<(), StorageAddressError> { + if address_bytes.len() >= 16 { + *address_bytes = &address_bytes[16..]; + Ok(()) + } else { + Err(StorageAddressError::UnexpectedAddressBytes) + } +} + +/// A pair of keys and values together with all the bytes that make up the storage address. +/// `keys` is `None` if non-concat hashers are used. In this case the keys could not be extracted back from the key_bytes. +#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] +pub struct StorageKeyValuePair { + /// The bytes that make up the address of the storage entry. + pub key_bytes: Vec, + /// The keys that can be used to construct the address of this storage entry. + pub keys: T::Keys, + /// The value of the storage entry. + pub value: T::Target, +} + /// Validate a storage address against the metadata. pub(crate) fn validate_storage_address( address: &Address, diff --git a/subxt/src/storage/utils.rs b/subxt/src/storage/utils.rs index 728a581baf..6024d9efc8 100644 --- a/subxt/src/storage/utils.rs +++ b/subxt/src/storage/utils.rs @@ -6,22 +6,24 @@ //! aren't things that should ever be overridden, and so don't exist on //! the trait itself. +use subxt_metadata::StorageHasher; + use super::StorageAddress; use crate::{error::Error, metadata::Metadata}; /// Return the root of a given [`StorageAddress`]: hash the pallet name and entry name /// and append those bytes to the output. -pub(crate) fn write_storage_address_root_bytes( +pub fn write_storage_address_root_bytes( addr: &Address, out: &mut Vec, ) { - out.extend(sp_core_hashing::twox_128(addr.pallet_name().as_bytes())); - out.extend(sp_core_hashing::twox_128(addr.entry_name().as_bytes())); + out.extend(sp_crypto_hashing::twox_128(addr.pallet_name().as_bytes())); + out.extend(sp_crypto_hashing::twox_128(addr.entry_name().as_bytes())); } /// Outputs the [`storage_address_root_bytes`] as well as any additional bytes that represent /// a lookup in a storage map at that location. -pub(crate) fn storage_address_bytes( +pub fn storage_address_bytes( addr: &Address, metadata: &Metadata, ) -> Result, Error> { @@ -32,8 +34,27 @@ pub(crate) fn storage_address_bytes( } /// Outputs a vector containing the bytes written by [`write_storage_address_root_bytes`]. -pub(crate) fn storage_address_root_bytes(addr: &Address) -> Vec { +pub fn storage_address_root_bytes(addr: &Address) -> Vec { let mut bytes = Vec::new(); write_storage_address_root_bytes(addr, &mut bytes); bytes } + +/// Take some SCALE encoded bytes and a [`StorageHasher`] and hash the bytes accordingly. +pub fn hash_bytes(input: &[u8], hasher: StorageHasher, bytes: &mut Vec) { + match hasher { + StorageHasher::Identity => bytes.extend(input), + StorageHasher::Blake2_128 => bytes.extend(sp_crypto_hashing::blake2_128(input)), + StorageHasher::Blake2_128Concat => { + bytes.extend(sp_crypto_hashing::blake2_128(input)); + bytes.extend(input); + } + StorageHasher::Blake2_256 => bytes.extend(sp_crypto_hashing::blake2_256(input)), + StorageHasher::Twox128 => bytes.extend(sp_crypto_hashing::twox_128(input)), + StorageHasher::Twox256 => bytes.extend(sp_crypto_hashing::twox_256(input)), + StorageHasher::Twox64Concat => { + bytes.extend(sp_crypto_hashing::twox_64(input)); + bytes.extend(input); + } + } +} diff --git a/subxt/src/tx/mod.rs b/subxt/src/tx/mod.rs index 0bb2d9f3eb..c48cf1382b 100644 --- a/subxt/src/tx/mod.rs +++ b/subxt/src/tx/mod.rs @@ -28,6 +28,6 @@ pub use self::{ PartialExtrinsic, SubmittableExtrinsic, TransactionInvalid, TransactionUnknown, TxClient, ValidationResult, }, - tx_payload::{dynamic, BoxedPayload, DynamicPayload, Payload, TxPayload}, + tx_payload::{dynamic, DynamicPayload, Payload, TxPayload}, tx_progress::{TxInBlock, TxProgress, TxStatus}, }; diff --git a/subxt/src/tx/tx_client.rs b/subxt/src/tx/tx_client.rs index 6bf6c9ab57..c4a5924c11 100644 --- a/subxt/src/tx/tx_client.rs +++ b/subxt/src/tx/tx_client.rs @@ -7,14 +7,17 @@ use std::borrow::Cow; use crate::{ backend::{BackendExt, BlockRef, TransactionStatus}, client::{OfflineClientT, OnlineClientT}, - config::{Config, ExtrinsicParams, ExtrinsicParamsEncoder, Hasher}, - error::{Error, MetadataError}, + config::{ + Config, ExtrinsicParams, ExtrinsicParamsEncoder, Hasher, Header, RefineParams, + RefineParamsData, + }, + error::{BlockError, Error, MetadataError}, tx::{Signer as SignerT, TxPayload, TxProgress}, utils::{Encoded, PhantomDataSendSync}, }; use codec::{Compact, Decode, Encode}; use derivative::Derivative; -use sp_core_hashing::blake2_256; +use sp_crypto_hashing::blake2_256; /// A client for working with transactions. #[derive(Derivative)] @@ -103,11 +106,13 @@ impl> TxClient { } /// Create a partial extrinsic. - pub fn create_partial_signed_with_nonce( + /// + /// Note: if not provided, the default account nonce will be set to 0 and the default mortality will be _immortal_. + /// This is because this method runs offline, and so is unable to fetch the data needed for more appropriate values. + pub fn create_partial_signed_offline( &self, call: &Call, - account_nonce: u64, - other_params: >::OtherParams, + params: >::Params, ) -> Result, Error> where Call: TxPayload, @@ -120,11 +125,8 @@ impl> TxClient { let call_data = self.call_data(call)?; // 3. Construct our custom additional/extra params. - let additional_and_extra_params = >::new( - account_nonce, - self.client.clone(), - other_params, - )?; + let additional_and_extra_params = + >::new(self.client.clone(), params)?; // Return these details, ready to construct a signed extrinsic from. Ok(PartialExtrinsic { @@ -135,12 +137,14 @@ impl> TxClient { } /// Creates a signed extrinsic without submitting it. - pub fn create_signed_with_nonce( + /// + /// Note: if not provided, the default account nonce will be set to 0 and the default mortality will be _immortal_. + /// This is because this method runs offline, and so is unable to fetch the data needed for more appropriate values. + pub fn create_signed_offline( &self, call: &Call, signer: &Signer, - account_nonce: u64, - other_params: >::OtherParams, + params: >::Params, ) -> Result, Error> where Call: TxPayload, @@ -152,8 +156,7 @@ impl> TxClient { // 2. Gather the "additional" and "extra" params along with the encoded call data, // ready to be signed. - let partial_signed = - self.create_partial_signed_with_nonce(call, account_nonce, other_params)?; + let partial_signed = self.create_partial_signed_offline(call, params)?; // 3. Sign and construct an extrinsic from these details. Ok(partial_signed.sign(signer)) @@ -165,6 +168,30 @@ where T: Config, C: OnlineClientT, { + /// Fetch the latest block header and account nonce from the backend and use them to refine [`ExtrinsicParams::Params`]. + async fn refine_params( + &self, + account_id: &T::AccountId, + params: &mut >::Params, + ) -> Result<(), Error> { + let block_ref = self.client.backend().latest_finalized_block_ref().await?; + let block_header = self + .client + .backend() + .block_header(block_ref.hash()) + .await? + .ok_or_else(|| Error::Block(BlockError::not_found(block_ref.hash())))?; + let account_nonce = + crate::blocks::get_account_nonce(&self.client, account_id, block_ref.hash()).await?; + + params.refine(&RefineParamsData::new( + account_nonce, + block_header.number().into(), + block_header.hash(), + )); + Ok(()) + } + /// Get the account nonce for a given account ID. pub async fn account_nonce(&self, account_id: &T::AccountId) -> Result { let block_ref = self.client.backend().latest_finalized_block_ref().await?; @@ -176,13 +203,15 @@ where &self, call: &Call, account_id: &T::AccountId, - other_params: >::OtherParams, + mut params: >::Params, ) -> Result, Error> where Call: TxPayload, { - let account_nonce = self.account_nonce(account_id).await?; - self.create_partial_signed_with_nonce(call, account_nonce, other_params) + // Refine the params by adding account nonce and latest block information: + self.refine_params(account_id, &mut params).await?; + // Create the partial extrinsic with the refined params: + self.create_partial_signed_offline(call, params) } /// Creates a signed extrinsic, without submitting it. @@ -190,14 +219,24 @@ where &self, call: &Call, signer: &Signer, - other_params: >::OtherParams, + params: >::Params, ) -> Result, Error> where Call: TxPayload, Signer: SignerT, { - let account_nonce = self.account_nonce(&signer.account_id()).await?; - self.create_signed_with_nonce(call, signer, account_nonce, other_params) + // 1. Validate this call against the current node metadata if the call comes + // with a hash allowing us to do so. + self.validate(call)?; + + // 2. Gather the "additional" and "extra" params along with the encoded call data, + // ready to be signed. + let partial_signed = self + .create_partial_signed(call, &signer.account_id(), params) + .await?; + + // 3. Sign and construct an extrinsic from these details. + Ok(partial_signed.sign(signer)) } /// Creates and signs an extrinsic and submits it to the chain. Passes default parameters @@ -213,7 +252,7 @@ where where Call: TxPayload, Signer: SignerT, - >::OtherParams: Default, + >::Params: Default, { self.sign_and_submit_then_watch(call, signer, Default::default()) .await @@ -227,13 +266,13 @@ where &self, call: &Call, signer: &Signer, - other_params: >::OtherParams, + params: >::Params, ) -> Result, Error> where Call: TxPayload, Signer: SignerT, { - self.create_signed(call, signer, other_params) + self.create_signed(call, signer, params) .await? .submit_and_watch() .await @@ -257,7 +296,7 @@ where where Call: TxPayload, Signer: SignerT, - >::OtherParams: Default, + >::Params: Default, { self.sign_and_submit(call, signer, Default::default()).await } @@ -274,13 +313,13 @@ where &self, call: &Call, signer: &Signer, - other_params: >::OtherParams, + params: >::Params, ) -> Result where Call: TxPayload, Signer: SignerT, { - self.create_signed(call, signer, other_params) + self.create_signed(call, signer, params) .await? .submit() .await diff --git a/subxt/src/tx/tx_payload.rs b/subxt/src/tx/tx_payload.rs index ff9c71fd21..c2a1dbe65c 100644 --- a/subxt/src/tx/tx_payload.rs +++ b/subxt/src/tx/tx_payload.rs @@ -14,7 +14,7 @@ use codec::Encode; use derivative::Derivative; use scale_encode::EncodeAsFields; use scale_value::{Composite, ValueDef, Variant}; -use std::{borrow::Cow, sync::Arc}; +use std::borrow::Cow; /// This represents a transaction payload that can be submitted /// to a node. @@ -65,10 +65,6 @@ pub struct Payload { validation_hash: Option<[u8; 32]>, } -/// A boxed transaction payload. -// Dev Note: Arc used to enable easy cloning (given that we can't have dyn Clone). -pub type BoxedPayload = Payload>; - /// The type of a payload typically used for dynamic transaction payloads. pub type DynamicPayload = Payload>; @@ -104,19 +100,6 @@ impl Payload { } } - /// Box the payload. - pub fn boxed(self) -> BoxedPayload - where - CallData: EncodeAsFields + Send + Sync + 'static, - { - BoxedPayload { - pallet_name: self.pallet_name, - call_name: self.call_name, - call_data: Arc::new(self.call_data), - validation_hash: self.validation_hash, - } - } - /// Do not validate this call prior to submitting it. pub fn unvalidated(self) -> Self { Self { @@ -174,7 +157,7 @@ impl TxPayload for Payload { let mut fields = call .fields .iter() - .map(|f| scale_encode::Field::new(f.ty.id, f.name.as_deref())); + .map(|f| scale_encode::Field::new(&f.ty.id, f.name.as_deref())); self.call_data .encode_as_fields_to(&mut fields, metadata.types(), out)?; diff --git a/subxt/src/utils/bits.rs b/subxt/src/utils/bits.rs index ed830a0dea..6c334d701c 100644 --- a/subxt/src/utils/bits.rs +++ b/subxt/src/utils/bits.rs @@ -9,7 +9,8 @@ use scale_bits::{ scale::format::{Format, OrderFormat, StoreFormat}, Bits, }; -use scale_decode::IntoVisitor; +use scale_decode::{IntoVisitor, TypeResolver}; + use std::marker::PhantomData; /// Associates `bitvec::store::BitStore` trait with corresponding, type-erased `scale_bits::StoreFormat` enum. @@ -144,45 +145,43 @@ impl codec::Encode for DecodedBits(std::marker::PhantomData<(S, O)>); -impl scale_decode::Visitor for DecodedBitsVisitor { +pub struct DecodedBitsVisitor(std::marker::PhantomData<(S, O, R)>); + +impl scale_decode::Visitor for DecodedBitsVisitor { type Value<'scale, 'info> = DecodedBits; type Error = scale_decode::Error; + type TypeResolver = R; fn unchecked_decode_as_type<'scale, 'info>( self, input: &mut &'scale [u8], - type_id: scale_decode::visitor::TypeId, - types: &'info scale_info::PortableRegistry, + type_id: &R::TypeId, + types: &'info R, ) -> scale_decode::visitor::DecodeAsTypeResult< Self, Result, Self::Error>, > { - let res = scale_decode::visitor::decode_with_visitor( - input, - type_id.0, - types, - Bits::into_visitor(), - ) - .map(|bits| DecodedBits { - bits, - _marker: PhantomData, - }); + let res = + scale_decode::visitor::decode_with_visitor(input, type_id, types, Bits::into_visitor()) + .map(|bits| DecodedBits { + bits, + _marker: PhantomData, + }); scale_decode::visitor::DecodeAsTypeResult::Decoded(res) } } impl scale_decode::IntoVisitor for DecodedBits { - type Visitor = DecodedBitsVisitor; - fn into_visitor() -> Self::Visitor { + type AnyVisitor = DecodedBitsVisitor; + fn into_visitor() -> DecodedBitsVisitor { DecodedBitsVisitor(PhantomData) } } impl scale_encode::EncodeAsType for DecodedBits { - fn encode_as_type_to( + fn encode_as_type_to( &self, - type_id: u32, - types: &scale_info::PortableRegistry, + type_id: &R::TypeId, + types: &R, out: &mut Vec, ) -> Result<(), scale_encode::Error> { self.bits.encode_as_type_to(type_id, types, out) diff --git a/subxt/src/utils/fetch_chain_spec.rs b/subxt/src/utils/fetch_chain_spec.rs new file mode 100644 index 0000000000..b2881276c3 --- /dev/null +++ b/subxt/src/utils/fetch_chain_spec.rs @@ -0,0 +1,113 @@ +// Copyright 2019-2024 Parity Technologies (UK) Ltd. +// This file is dual-licensed as Apache-2.0 or GPL-3.0. +// see LICENSE for license details. + +use crate::macros::{cfg_jsonrpsee_native, cfg_jsonrpsee_web}; +use serde_json::value::RawValue; + +/// Possible errors encountered trying to fetch a chain spec from an RPC node. +#[derive(thiserror::Error, Debug)] +#[allow(missing_docs)] +pub enum FetchChainspecError { + #[error("Cannot fetch chain spec: RPC error: {0}.")] + RpcError(String), + #[error("Cannot fetch chain spec: Invalid URL.")] + InvalidUrl, + #[error("Cannot fetch chain spec: Invalid URL scheme.")] + InvalidScheme, + #[error("Cannot fetch chain spec: Handshake error establishing WS connection.")] + HandshakeError, +} + +/// Fetch a chain spec from an RPC node at the given URL. +pub async fn fetch_chainspec_from_rpc_node( + url: impl AsRef, +) -> Result, FetchChainspecError> { + use jsonrpsee::core::client::{ClientT, SubscriptionClientT}; + use jsonrpsee::rpc_params; + + let client = jsonrpsee_helpers::client(url.as_ref()).await?; + + let result = client + .request("sync_state_genSyncSpec", jsonrpsee::rpc_params![true]) + .await + .map_err(|err| FetchChainspecError::RpcError(err.to_string()))?; + + // Subscribe to the finalized heads of the chain. + let mut subscription = SubscriptionClientT::subscribe::, _>( + &client, + "chain_subscribeFinalizedHeads", + rpc_params![], + "chain_unsubscribeFinalizedHeads", + ) + .await + .map_err(|err| FetchChainspecError::RpcError(err.to_string()))?; + + // We must ensure that the finalized block of the chain is not the block included + // in the chainSpec. + // This is a temporary workaround for: https://github.com/smol-dot/smoldot/issues/1562. + // The first finalized block that is received might by the finalized block could be the one + // included in the chainSpec. Decoding the chainSpec for this purpose is too complex. + let _ = subscription.next().await; + let _ = subscription.next().await; + + Ok(result) +} + +cfg_jsonrpsee_native! { + mod jsonrpsee_helpers { + use super::FetchChainspecError; + use tokio_util::compat::Compat; + + pub use jsonrpsee::{ + client_transport::ws::{self, EitherStream, Url, WsTransportClientBuilder}, + core::client::Client, + }; + + pub type Sender = ws::Sender>; + pub type Receiver = ws::Receiver>; + + /// Build WS RPC client from URL + pub async fn client(url: &str) -> Result { + let url = Url::parse(url).map_err(|_| FetchChainspecError::InvalidUrl)?; + + if url.scheme() != "ws" && url.scheme() != "wss" { + return Err(FetchChainspecError::InvalidScheme); + } + + let (sender, receiver) = ws_transport(url).await?; + + Ok(Client::builder() + .max_buffer_capacity_per_subscription(4096) + .build_with_tokio(sender, receiver)) + } + + async fn ws_transport(url: Url) -> Result<(Sender, Receiver), FetchChainspecError> { + WsTransportClientBuilder::default() + .build(url) + .await + .map_err(|_| FetchChainspecError::HandshakeError) + } + } +} + +cfg_jsonrpsee_web! { + mod jsonrpsee_helpers { + use super::FetchChainspecError; + pub use jsonrpsee::{ + client_transport::web, + core::client::{Client, ClientBuilder}, + }; + + /// Build web RPC client from URL + pub async fn client(url: &str) -> Result { + let (sender, receiver) = web::connect(url) + .await + .map_err(|_| FetchChainspecError::HandshakeError)?; + + Ok(ClientBuilder::default() + .max_buffer_capacity_per_subscription(4096) + .build_with_wasm(sender, receiver)) + } + } +} diff --git a/subxt/src/utils/mod.rs b/subxt/src/utils/mod.rs index dc9320a303..7826ffcfad 100644 --- a/subxt/src/utils/mod.rs +++ b/subxt/src/utils/mod.rs @@ -14,6 +14,7 @@ mod unchecked_extrinsic; mod wrapper_opaque; use crate::error::RpcError; +use crate::macros::cfg_jsonrpsee; use crate::Error; use codec::{Compact, Decode, Encode}; use derivative::Derivative; @@ -27,6 +28,11 @@ pub use static_type::Static; pub use unchecked_extrinsic::UncheckedExtrinsic; pub use wrapper_opaque::WrapperKeepOpaque; +cfg_jsonrpsee! { + mod fetch_chain_spec; + pub use fetch_chain_spec::{fetch_chainspec_from_rpc_node, FetchChainspecError}; +} + // Used in codegen #[doc(hidden)] pub use primitive_types::{H160, H256, H512}; diff --git a/subxt/src/utils/static_type.rs b/subxt/src/utils/static_type.rs index 2d13e61eba..6cf1285f8b 100644 --- a/subxt/src/utils/static_type.rs +++ b/subxt/src/utils/static_type.rs @@ -3,7 +3,7 @@ // see LICENSE for license details. use codec::{Decode, Encode}; -use scale_decode::{visitor::DecodeAsTypeResult, IntoVisitor, Visitor}; +use scale_decode::{visitor::DecodeAsTypeResult, IntoVisitor, TypeResolver, Visitor}; use scale_encode::EncodeAsType; /// If the type inside this implements [`Encode`], this will implement [`scale_encode::EncodeAsType`]. @@ -18,10 +18,10 @@ use scale_encode::EncodeAsType; pub struct Static(pub T); impl EncodeAsType for Static { - fn encode_as_type_to( + fn encode_as_type_to( &self, - _type_id: u32, - _types: &scale_decode::PortableRegistry, + _type_id: &R::TypeId, + _types: &R, out: &mut Vec, ) -> Result<(), scale_encode::Error> { self.0.encode_to(out); @@ -29,17 +29,18 @@ impl EncodeAsType for Static { } } -pub struct StaticDecodeAsTypeVisitor(std::marker::PhantomData); +pub struct StaticDecodeAsTypeVisitor(std::marker::PhantomData<(T, R)>); -impl Visitor for StaticDecodeAsTypeVisitor { +impl Visitor for StaticDecodeAsTypeVisitor { type Value<'scale, 'info> = Static; type Error = scale_decode::Error; + type TypeResolver = R; fn unchecked_decode_as_type<'scale, 'info>( self, input: &mut &'scale [u8], - _type_id: scale_decode::visitor::TypeId, - _types: &'info scale_info::PortableRegistry, + _type_id: &R::TypeId, + _types: &'info R, ) -> DecodeAsTypeResult, Self::Error>> { use scale_decode::{visitor::DecodeError, Error}; let decoded = T::decode(input) @@ -50,8 +51,8 @@ impl Visitor for StaticDecodeAsTypeVisitor { } impl IntoVisitor for Static { - type Visitor = StaticDecodeAsTypeVisitor; - fn into_visitor() -> Self::Visitor { + type AnyVisitor = StaticDecodeAsTypeVisitor; + fn into_visitor() -> StaticDecodeAsTypeVisitor { StaticDecodeAsTypeVisitor(std::marker::PhantomData) } } diff --git a/subxt/src/utils/unchecked_extrinsic.rs b/subxt/src/utils/unchecked_extrinsic.rs index 882b490bed..14ad39e790 100644 --- a/subxt/src/utils/unchecked_extrinsic.rs +++ b/subxt/src/utils/unchecked_extrinsic.rs @@ -12,7 +12,7 @@ use std::marker::PhantomData; use codec::{Decode, Encode}; -use scale_decode::{visitor::DecodeAsTypeResult, DecodeAsType, IntoVisitor, Visitor}; +use scale_decode::{visitor::DecodeAsTypeResult, DecodeAsType, IntoVisitor, TypeResolver, Visitor}; use super::{Encoded, Static}; @@ -52,10 +52,10 @@ impl Decode impl scale_encode::EncodeAsType for UncheckedExtrinsic { - fn encode_as_type_to( + fn encode_as_type_to( &self, - type_id: u32, - types: &scale_info::PortableRegistry, + type_id: &R::TypeId, + types: &R, out: &mut Vec, ) -> Result<(), scale_encode::Error> { self.0.encode_as_type_to(type_id, types, out) @@ -78,32 +78,35 @@ impl From( - PhantomData<(Address, Call, Signature, Extra)>, +pub struct UncheckedExtrinsicDecodeAsTypeVisitor( + PhantomData<(Address, Call, Signature, Extra, R)>, ); -impl Visitor - for UncheckedExtrinsicDecodeAsTypeVisitor +impl Visitor + for UncheckedExtrinsicDecodeAsTypeVisitor { type Value<'scale, 'info> = UncheckedExtrinsic; type Error = scale_decode::Error; + type TypeResolver = R; fn unchecked_decode_as_type<'scale, 'info>( self, input: &mut &'scale [u8], - type_id: scale_decode::visitor::TypeId, - types: &'info scale_info::PortableRegistry, + type_id: &R::TypeId, + types: &'info R, ) -> DecodeAsTypeResult, Self::Error>> { - DecodeAsTypeResult::Decoded(Self::Value::decode_as_type(input, type_id.0, types)) + DecodeAsTypeResult::Decoded(Self::Value::decode_as_type(input, type_id, types)) } } impl IntoVisitor for UncheckedExtrinsic { - type Visitor = UncheckedExtrinsicDecodeAsTypeVisitor; + type AnyVisitor = + UncheckedExtrinsicDecodeAsTypeVisitor; - fn into_visitor() -> Self::Visitor { + fn into_visitor( + ) -> UncheckedExtrinsicDecodeAsTypeVisitor { UncheckedExtrinsicDecodeAsTypeVisitor(PhantomData) } } diff --git a/subxt/src/utils/wrapper_opaque.rs b/subxt/src/utils/wrapper_opaque.rs index 9257405715..7888dee47f 100644 --- a/subxt/src/utils/wrapper_opaque.rs +++ b/subxt/src/utils/wrapper_opaque.rs @@ -5,7 +5,7 @@ use super::PhantomDataSendSync; use codec::{Compact, Decode, DecodeAll, Encode}; use derivative::Derivative; -use scale_decode::{IntoVisitor, Visitor}; +use scale_decode::{ext::scale_type_resolver::visitor, IntoVisitor, TypeResolver, Visitor}; use scale_encode::EncodeAsType; /// A wrapper for any type `T` which implement encode/decode in a way compatible with `Vec`. @@ -74,57 +74,47 @@ impl WrapperKeepOpaque { } impl EncodeAsType for WrapperKeepOpaque { - fn encode_as_type_to( + fn encode_as_type_to( &self, - type_id: u32, - types: &scale_info::PortableRegistry, + type_id: &R::TypeId, + types: &R, out: &mut Vec, ) -> Result<(), scale_encode::Error> { use scale_encode::error::{Error, ErrorKind, Kind}; - let Some(ty) = types.resolve(type_id) else { - return Err(Error::new(ErrorKind::TypeNotFound(type_id))); - }; - - // Do a basic check that the target shape lines up. - let scale_info::TypeDef::Composite(_) = &ty.type_def else { - return Err(Error::new(ErrorKind::WrongShape { + let visitor = visitor::new(out, |_, _| { + // Check that the target shape lines up: any other shape but the composite is wrong. + Err(Error::new(ErrorKind::WrongShape { actual: Kind::Struct, - expected: type_id, - })); - }; + expected_id: format!("{:?}", type_id), + })) + }) + .visit_composite(|out, _fields| { + self.data.encode_to(out); + Ok(()) + }); - // Check that the name also lines up. - if ty.path.ident().as_deref() != Some("WrapperKeepOpaque") { - return Err(Error::new(ErrorKind::WrongShape { - actual: Kind::Struct, - expected: type_id, - })); - } - - // Just blat the bytes out. - self.data.encode_to(out); - Ok(()) + types + .resolve_type(type_id, visitor) + .map_err(|_| Error::new(ErrorKind::TypeNotFound(format!("{:?}", type_id))))? } } -pub struct WrapperKeepOpaqueVisitor(std::marker::PhantomData); -impl Visitor for WrapperKeepOpaqueVisitor { +pub struct WrapperKeepOpaqueVisitor(std::marker::PhantomData<(T, R)>); +impl Visitor for WrapperKeepOpaqueVisitor { type Value<'scale, 'info> = WrapperKeepOpaque; type Error = scale_decode::Error; + type TypeResolver = R; fn visit_composite<'scale, 'info>( self, - value: &mut scale_decode::visitor::types::Composite<'scale, 'info>, - _type_id: scale_decode::visitor::TypeId, + value: &mut scale_decode::visitor::types::Composite<'scale, 'info, R>, + _type_id: &R::TypeId, ) -> Result, Self::Error> { use scale_decode::error::{Error, ErrorKind}; - if value.path().ident().as_deref() != Some("WrapperKeepOpaque") { - return Err(Error::custom_str( - "Type to decode is not 'WrapperTypeKeepOpaque'", - )); - } + // TODO: When `scale-type-resolver` [provides struct names](https://github.com/paritytech/scale-type-resolver/issues/4), check that this struct name is `WrapperKeepOpaque` + if value.remaining() != 2 { return Err(Error::new(ErrorKind::WrongLength { actual_len: value.remaining(), @@ -151,8 +141,8 @@ impl Visitor for WrapperKeepOpaqueVisitor { } impl IntoVisitor for WrapperKeepOpaque { - type Visitor = WrapperKeepOpaqueVisitor; - fn into_visitor() -> Self::Visitor { + type AnyVisitor = WrapperKeepOpaqueVisitor; + fn into_visitor() -> WrapperKeepOpaqueVisitor { WrapperKeepOpaqueVisitor(std::marker::PhantomData) } } @@ -205,7 +195,7 @@ mod test { let (type_id, types) = make_type::(); let scale_codec_encoded = t.encode(); - let encode_as_type_encoded = t.encode_as_type(type_id, &types).unwrap(); + let encode_as_type_encoded = t.encode_as_type(&type_id, &types).unwrap(); assert_eq!( scale_codec_encoded, encode_as_type_encoded, @@ -213,7 +203,7 @@ mod test { ); let decode_as_type_bytes = &mut &*scale_codec_encoded; - let decoded_as_type = T::decode_as_type(decode_as_type_bytes, type_id, &types) + let decoded_as_type = T::decode_as_type(decode_as_type_bytes, &type_id, &types) .expect("decode-as-type decodes"); let decode_scale_codec_bytes = &mut &*scale_codec_encoded; diff --git a/testing/integration-tests/Cargo.toml b/testing/integration-tests/Cargo.toml index fb55fb857d..670b0a80ac 100644 --- a/testing/integration-tests/Cargo.toml +++ b/testing/integration-tests/Cargo.toml @@ -37,7 +37,7 @@ scale-info = { workspace = true, features = ["bit-vec"] } sp-core = { workspace = true } syn = { workspace = true } subxt = { workspace = true, features = ["unstable-metadata", "native", "jsonrpsee", "substrate-compat"] } -subxt-signer = { workspace = true } +subxt-signer = { workspace = true, features = ["default"] } subxt-codegen = { workspace = true } subxt-metadata = { workspace = true } test-runtime = { workspace = true } diff --git a/testing/integration-tests/src/full_client/client/unstable_rpcs.rs b/testing/integration-tests/src/full_client/client/unstable_rpcs.rs index 1cf65473f2..f87aff9ff5 100644 --- a/testing/integration-tests/src/full_client/client/unstable_rpcs.rs +++ b/testing/integration-tests/src/full_client/client/unstable_rpcs.rs @@ -14,7 +14,9 @@ use subxt::{ FollowEvent, Initialized, MethodResponse, RuntimeEvent, RuntimeVersionEvent, StorageQuery, StorageQueryType, }, - utils::AccountId32, + config::Hasher, + utils::{AccountId32, MultiAddress}, + SubstrateConfig, }; #[cfg(lightclient)] @@ -36,7 +38,7 @@ async fn chainhead_unstable_follow() { assert_eq!( event, FollowEvent::Initialized(Initialized { - finalized_block_hash, + finalized_block_hashes: vec![finalized_block_hash], finalized_block_runtime: None, }) ); @@ -51,7 +53,7 @@ async fn chainhead_unstable_follow() { assert_matches!( event, FollowEvent::Initialized(init) => { - assert_eq!(init.finalized_block_hash, finalized_block_hash); + assert_eq!(init.finalized_block_hashes, vec![finalized_block_hash]); if let Some(RuntimeEvent::Valid(RuntimeVersionEvent { spec })) = init.finalized_block_runtime { assert_eq!(spec.spec_version, runtime_version.spec_version); assert_eq!(spec.transaction_version, runtime_version.transaction_version); @@ -70,7 +72,7 @@ async fn chainhead_unstable_body() { let mut blocks = rpc.chainhead_unstable_follow(false).await.unwrap(); let event = blocks.next().await.unwrap().unwrap(); let hash = match event { - FollowEvent::Initialized(init) => init.finalized_block_hash, + FollowEvent::Initialized(init) => init.finalized_block_hashes.last().unwrap().clone(), _ => panic!("Unexpected event"), }; let sub_id = blocks.subscription_id().unwrap(); @@ -99,7 +101,7 @@ async fn chainhead_unstable_header() { let mut blocks = rpc.chainhead_unstable_follow(false).await.unwrap(); let event = blocks.next().await.unwrap().unwrap(); let hash = match event { - FollowEvent::Initialized(init) => init.finalized_block_hash, + FollowEvent::Initialized(init) => init.finalized_block_hashes.last().unwrap().clone(), _ => panic!("Unexpected event"), }; let sub_id = blocks.subscription_id().unwrap(); @@ -127,7 +129,7 @@ async fn chainhead_unstable_storage() { let mut blocks = rpc.chainhead_unstable_follow(false).await.unwrap(); let event = blocks.next().await.unwrap().unwrap(); let hash = match event { - FollowEvent::Initialized(init) => init.finalized_block_hash, + FollowEvent::Initialized(init) => init.finalized_block_hashes.last().unwrap().clone(), _ => panic!("Unexpected event"), }; let sub_id = blocks.subscription_id().unwrap(); @@ -172,7 +174,7 @@ async fn chainhead_unstable_call() { let mut blocks = rpc.chainhead_unstable_follow(true).await.unwrap(); let event = blocks.next().await.unwrap().unwrap(); let hash = match event { - FollowEvent::Initialized(init) => init.finalized_block_hash, + FollowEvent::Initialized(init) => init.finalized_block_hashes.last().unwrap().clone(), _ => panic!("Unexpected event"), }; let sub_id = blocks.subscription_id().unwrap(); @@ -209,7 +211,7 @@ async fn chainhead_unstable_unpin() { let mut blocks = rpc.chainhead_unstable_follow(true).await.unwrap(); let event = blocks.next().await.unwrap().unwrap(); let hash = match event { - FollowEvent::Initialized(init) => init.finalized_block_hash, + FollowEvent::Initialized(init) => init.finalized_block_hashes.last().unwrap().clone(), _ => panic!("Unexpected event"), }; let sub_id = blocks.subscription_id().unwrap(); @@ -269,7 +271,7 @@ async fn transaction_unstable_submit_and_watch() { let tx_bytes = ctx .client() .tx() - .create_signed_with_nonce(&payload, &dev::alice(), 0, Default::default()) + .create_signed_offline(&payload, &dev::alice(), Default::default()) .unwrap() .into_encoded(); @@ -317,3 +319,108 @@ async fn next_operation_event< panic!("Cannot find operation related event after {NUM_EVENTS} produced events"); } + +#[tokio::test] +async fn transaction_unstable_broadcast() { + let bob = dev::bob(); + let bob_address: MultiAddress = bob.public_key().into(); + + let ctx = test_context().await; + let api = ctx.client(); + let rpc = ctx.unstable_rpc_methods().await; + + let tx = node_runtime::tx() + .balances() + .transfer_allow_death(bob_address.clone(), 10_001); + + let tx_bytes = ctx + .client() + .tx() + .create_signed_offline(&tx, &dev::alice(), Default::default()) + .unwrap() + .into_encoded(); + + let tx_hash = ::Hasher::hash(&tx_bytes[2..]); + + // Subscribe to finalized blocks. + let mut finalized_sub = api.blocks().subscribe_finalized().await.unwrap(); + // Expect the tx to be encountered in a maximum number of blocks. + let mut num_blocks: usize = 10; + + // Submit the transaction. + let _operation_id = rpc + .transaction_unstable_broadcast(&tx_bytes) + .await + .unwrap() + .expect("Server is not overloaded by 1 tx; qed"); + + while let Some(finalized) = finalized_sub.next().await { + let finalized = finalized.unwrap(); + + // Started with positive, should not overflow. + num_blocks = num_blocks.saturating_sub(1); + if num_blocks == 0 { + panic!("Did not find the tx in due time"); + } + + let extrinsics = finalized.extrinsics().await.unwrap(); + let block_extrinsics = extrinsics + .iter() + .map(|res| res.unwrap()) + .collect::>(); + + let Some(ext) = block_extrinsics + .iter() + .find(|ext| ::Hasher::hash(ext.bytes()) == tx_hash) + else { + continue; + }; + + let ext = ext + .as_extrinsic::() + .unwrap() + .unwrap(); + assert_eq!(ext.value, 10_001); + return; + } +} + +#[tokio::test] +async fn transaction_unstable_stop() { + let bob = dev::bob(); + let bob_address: MultiAddress = bob.public_key().into(); + + let ctx = test_context().await; + let rpc = ctx.unstable_rpc_methods().await; + + // Cannot stop an operation that was not started. + let _err = rpc + .transaction_unstable_stop("non-existent-operation-id") + .await + .unwrap_err(); + + // Submit a transaction and stop it. + let tx = node_runtime::tx() + .balances() + .transfer_allow_death(bob_address.clone(), 10_001); + let tx_bytes = ctx + .client() + .tx() + .create_signed_offline(&tx, &dev::alice(), Default::default()) + .unwrap() + .into_encoded(); + + // Submit the transaction. + let operation_id = rpc + .transaction_unstable_broadcast(&tx_bytes) + .await + .unwrap() + .expect("Server is not overloaded by 1 tx; qed"); + + let _ = rpc.transaction_unstable_stop(&operation_id).await.unwrap(); + // Cannot stop it twice. + let _err = rpc + .transaction_unstable_stop(&operation_id) + .await + .unwrap_err(); +} diff --git a/testing/integration-tests/src/full_client/codegen/polkadot.rs b/testing/integration-tests/src/full_client/codegen/polkadot.rs index ba064ab70a..f07877742b 100644 --- a/testing/integration-tests/src/full_client/codegen/polkadot.rs +++ b/testing/integration-tests/src/full_client/codegen/polkadot.rs @@ -6,7 +6,7 @@ pub mod api { mod root_mod { pub use super::*; } - pub static PALLETS: [&str; 67usize] = [ + pub static PALLETS: [&str; 66usize] = [ "System", "Babe", "Timestamp", @@ -56,7 +56,6 @@ pub mod api { "ParasSlashing", "MessageQueue", "OnDemandAssignmentProvider", - "ParachainsAssignmentProvider", "CoretimeAssignmentProvider", "Registrar", "Slots", @@ -216,7 +215,7 @@ pub mod api { ], ) } - #[doc = " Initialize a block with the given header."] + #[doc = " Initialize a block with the given header and return the runtime executive mode."] pub fn initialize_block( &self, header: types::initialize_block::Header, @@ -229,9 +228,9 @@ pub mod api { "initialize_block", types::InitializeBlock { header }, [ - 146u8, 138u8, 72u8, 240u8, 63u8, 96u8, 110u8, 189u8, 77u8, 92u8, 96u8, - 232u8, 41u8, 217u8, 105u8, 148u8, 83u8, 190u8, 152u8, 219u8, 19u8, - 87u8, 163u8, 1u8, 232u8, 25u8, 221u8, 74u8, 224u8, 67u8, 223u8, 34u8, + 132u8, 169u8, 113u8, 112u8, 80u8, 139u8, 113u8, 35u8, 41u8, 81u8, 36u8, + 35u8, 37u8, 202u8, 29u8, 207u8, 205u8, 229u8, 145u8, 7u8, 133u8, 94u8, + 25u8, 108u8, 233u8, 86u8, 234u8, 29u8, 236u8, 57u8, 56u8, 186u8, ], ) } @@ -283,7 +282,7 @@ pub mod api { runtime_types::sp_runtime::generic::header::Header<::core::primitive::u32>; pub mod output { use super::runtime_types; - pub type Output = (); + pub type Output = runtime_types::sp_runtime::ExtrinsicInclusionMode; } } #[derive( @@ -3440,13 +3439,13 @@ pub mod api { pub mod genesis_builder { use super::root_mod; use super::runtime_types; - #[doc = " API to interact with GenesisConfig for the runtime"] + #[doc = " API to interact with RuntimeGenesisConfig for the runtime"] pub struct GenesisBuilder; impl GenesisBuilder { - #[doc = " Creates the default `GenesisConfig` and returns it as a JSON blob."] + #[doc = " Creates the default `RuntimeGenesisConfig` and returns it as a JSON blob."] #[doc = ""] - #[doc = " This function instantiates the default `GenesisConfig` struct for the runtime and serializes it into a JSON"] - #[doc = " blob. It returns a `Vec` containing the JSON representation of the default `GenesisConfig`."] + #[doc = " This function instantiates the default `RuntimeGenesisConfig` struct for the runtime and serializes it into a JSON"] + #[doc = " blob. It returns a `Vec` containing the JSON representation of the default `RuntimeGenesisConfig`."] pub fn create_default_config( &self, ) -> ::subxt::runtime_api::Payload< @@ -3464,13 +3463,13 @@ pub mod api { ], ) } - #[doc = " Build `GenesisConfig` from a JSON blob not using any defaults and store it in the storage."] + #[doc = " Build `RuntimeGenesisConfig` from a JSON blob not using any defaults and store it in the storage."] #[doc = ""] - #[doc = " This function deserializes the full `GenesisConfig` from the given JSON blob and puts it into the storage."] + #[doc = " This function deserializes the full `RuntimeGenesisConfig` from the given JSON blob and puts it into the storage."] #[doc = " If the provided JSON blob is incorrect or incomplete or the deserialization fails, an error is returned."] #[doc = " It is recommended to log any errors encountered during the process."] #[doc = ""] - #[doc = " Please note that provided json blob must contain all `GenesisConfig` fields, no defaults will be used."] + #[doc = " Please note that provided json blob must contain all `RuntimeGenesisConfig` fields, no defaults will be used."] pub fn build_config( &self, json: types::build_config::Json, @@ -4009,9 +4008,9 @@ pub mod api { .hash(); runtime_metadata_hash == [ - 242u8, 57u8, 130u8, 28u8, 242u8, 22u8, 24u8, 111u8, 149u8, 94u8, 72u8, 167u8, 72u8, - 22u8, 128u8, 181u8, 113u8, 19u8, 74u8, 216u8, 162u8, 229u8, 14u8, 254u8, 68u8, - 90u8, 180u8, 37u8, 184u8, 74u8, 59u8, 10u8, + 156u8, 238u8, 89u8, 253u8, 131u8, 142u8, 74u8, 227u8, 39u8, 8u8, 168u8, 223u8, + 105u8, 129u8, 225u8, 253u8, 181u8, 1u8, 91u8, 107u8, 103u8, 177u8, 147u8, 165u8, + 10u8, 219u8, 72u8, 215u8, 120u8, 62u8, 229u8, 179u8, ] } pub mod system { @@ -4037,7 +4036,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remark`]."] + #[doc = "Make some on-chain remark."] + #[doc = ""] + #[doc = "Can be executed by every `origin`."] pub struct Remark { pub remark: remark::Remark, } @@ -4059,7 +4060,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_heap_pages`]."] + #[doc = "Set the number of pages in the WebAssembly environment's heap."] pub struct SetHeapPages { pub pages: set_heap_pages::Pages, } @@ -4081,7 +4082,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_code`]."] + #[doc = "Set the new runtime code."] pub struct SetCode { pub code: set_code::Code, } @@ -4103,7 +4104,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_code_without_checks`]."] + #[doc = "Set the new runtime code without doing any checks of the given `code`."] + #[doc = ""] + #[doc = "Note that runtime upgrades will not run if this is called with a not-increasing spec"] + #[doc = "version!"] pub struct SetCodeWithoutChecks { pub code: set_code_without_checks::Code, } @@ -4125,7 +4129,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_storage`]."] + #[doc = "Set some items of storage."] pub struct SetStorage { pub items: set_storage::Items, } @@ -4150,7 +4154,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::kill_storage`]."] + #[doc = "Kill some items from storage."] pub struct KillStorage { pub keys: kill_storage::Keys, } @@ -4172,7 +4176,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::kill_prefix`]."] + #[doc = "Kill all storage items with a key that starts with the given prefix."] + #[doc = ""] + #[doc = "**NOTE:** We rely on the Root origin to provide us the number of subkeys under"] + #[doc = "the prefix we are removing to accurately calculate the weight of this function."] pub struct KillPrefix { pub prefix: kill_prefix::Prefix, pub subkeys: kill_prefix::Subkeys, @@ -4196,7 +4203,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remark_with_event`]."] + #[doc = "Make some on-chain remark and emit event."] pub struct RemarkWithEvent { pub remark: remark_with_event::Remark, } @@ -4218,7 +4225,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::authorize_upgrade`]."] + #[doc = "Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied"] + #[doc = "later."] + #[doc = ""] + #[doc = "This call requires Root origin."] pub struct AuthorizeUpgrade { pub code_hash: authorize_upgrade::CodeHash, } @@ -4240,7 +4250,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::authorize_upgrade_without_checks`]."] + #[doc = "Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied"] + #[doc = "later."] + #[doc = ""] + #[doc = "WARNING: This authorizes an upgrade that will take place without any safety checks, for"] + #[doc = "example that the spec name remains the same and that the version number increases. Not"] + #[doc = "recommended for normal use. Use `authorize_upgrade` instead."] + #[doc = ""] + #[doc = "This call requires Root origin."] pub struct AuthorizeUpgradeWithoutChecks { pub code_hash: authorize_upgrade_without_checks::CodeHash, } @@ -4262,7 +4279,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::apply_authorized_upgrade`]."] + #[doc = "Provide the preimage (runtime binary) `code` for an upgrade that has been authorized."] + #[doc = ""] + #[doc = "If the authorization required a version check, this call will ensure the spec name"] + #[doc = "remains unchanged and that the spec version has increased."] + #[doc = ""] + #[doc = "Depending on the runtime's `OnSetCode` configuration, this function may directly apply"] + #[doc = "the new `code` in the same block or attempt to schedule the upgrade."] + #[doc = ""] + #[doc = "All origins are allowed."] pub struct ApplyAuthorizedUpgrade { pub code: apply_authorized_upgrade::Code, } @@ -4277,7 +4302,9 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::remark`]."] + #[doc = "Make some on-chain remark."] + #[doc = ""] + #[doc = "Can be executed by every `origin`."] pub fn remark( &self, remark: types::remark::Remark, @@ -4294,7 +4321,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_heap_pages`]."] + #[doc = "Set the number of pages in the WebAssembly environment's heap."] pub fn set_heap_pages( &self, pages: types::set_heap_pages::Pages, @@ -4311,7 +4338,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_code`]."] + #[doc = "Set the new runtime code."] pub fn set_code( &self, code: types::set_code::Code, @@ -4327,7 +4354,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_code_without_checks`]."] + #[doc = "Set the new runtime code without doing any checks of the given `code`."] + #[doc = ""] + #[doc = "Note that runtime upgrades will not run if this is called with a not-increasing spec"] + #[doc = "version!"] pub fn set_code_without_checks( &self, code: types::set_code_without_checks::Code, @@ -4344,7 +4374,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_storage`]."] + #[doc = "Set some items of storage."] pub fn set_storage( &self, items: types::set_storage::Items, @@ -4361,7 +4391,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::kill_storage`]."] + #[doc = "Kill some items from storage."] pub fn kill_storage( &self, keys: types::kill_storage::Keys, @@ -4378,7 +4408,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::kill_prefix`]."] + #[doc = "Kill all storage items with a key that starts with the given prefix."] + #[doc = ""] + #[doc = "**NOTE:** We rely on the Root origin to provide us the number of subkeys under"] + #[doc = "the prefix we are removing to accurately calculate the weight of this function."] pub fn kill_prefix( &self, prefix: types::kill_prefix::Prefix, @@ -4396,7 +4429,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remark_with_event`]."] + #[doc = "Make some on-chain remark and emit event."] pub fn remark_with_event( &self, remark: types::remark_with_event::Remark, @@ -4412,7 +4445,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::authorize_upgrade`]."] + #[doc = "Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied"] + #[doc = "later."] + #[doc = ""] + #[doc = "This call requires Root origin."] pub fn authorize_upgrade( &self, code_hash: types::authorize_upgrade::CodeHash, @@ -4429,7 +4465,14 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::authorize_upgrade_without_checks`]."] + #[doc = "Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied"] + #[doc = "later."] + #[doc = ""] + #[doc = "WARNING: This authorizes an upgrade that will take place without any safety checks, for"] + #[doc = "example that the spec name remains the same and that the version number increases. Not"] + #[doc = "recommended for normal use. Use `authorize_upgrade` instead."] + #[doc = ""] + #[doc = "This call requires Root origin."] pub fn authorize_upgrade_without_checks( &self, code_hash: types::authorize_upgrade_without_checks::CodeHash, @@ -4446,7 +4489,15 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::apply_authorized_upgrade`]."] + #[doc = "Provide the preimage (runtime binary) `code` for an upgrade that has been authorized."] + #[doc = ""] + #[doc = "If the authorization required a version check, this call will ensure the spec name"] + #[doc = "remains unchanged and that the spec version has increased."] + #[doc = ""] + #[doc = "Depending on the runtime's `OnSetCode` configuration, this function may directly apply"] + #[doc = "the new `code` in the same block or attempt to schedule the upgrade."] + #[doc = ""] + #[doc = "All origins are allowed."] pub fn apply_authorized_upgrade( &self, code: types::apply_authorized_upgrade::Code, @@ -4639,6 +4690,10 @@ pub mod api { use super::runtime_types; pub type ExtrinsicCount = ::core::primitive::u32; } + pub mod inherents_applied { + use super::runtime_types; + pub type InherentsApplied = ::core::primitive::bool; + } pub mod block_weight { use super::runtime_types; pub type BlockWeight = runtime_types::frame_support::dispatch::PerDispatchClass< @@ -4719,7 +4774,7 @@ pub mod api { pub fn account_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::account::Account, (), ::subxt::storage::address::Yes, @@ -4728,7 +4783,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "Account", - vec![], + (), [ 14u8, 233u8, 115u8, 214u8, 0u8, 109u8, 222u8, 121u8, 162u8, 65u8, 60u8, 175u8, 209u8, 79u8, 222u8, 124u8, 22u8, 235u8, 138u8, 176u8, 133u8, @@ -4741,7 +4796,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::account::Account, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -4750,9 +4805,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "Account", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 14u8, 233u8, 115u8, 214u8, 0u8, 109u8, 222u8, 121u8, 162u8, 65u8, 60u8, 175u8, 209u8, 79u8, 222u8, 124u8, 22u8, 235u8, 138u8, 176u8, 133u8, @@ -4764,7 +4817,7 @@ pub mod api { pub fn extrinsic_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::extrinsic_count::ExtrinsicCount, ::subxt::storage::address::Yes, (), @@ -4773,7 +4826,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "ExtrinsicCount", - vec![], + (), [ 102u8, 76u8, 236u8, 42u8, 40u8, 231u8, 33u8, 222u8, 123u8, 147u8, 153u8, 148u8, 234u8, 203u8, 181u8, 119u8, 6u8, 187u8, 177u8, 199u8, @@ -4782,11 +4835,32 @@ pub mod api { ], ) } + #[doc = " Whether all inherents have been applied."] + pub fn inherents_applied( + &self, + ) -> ::subxt::storage::address::Address< + (), + types::inherents_applied::InherentsApplied, + ::subxt::storage::address::Yes, + ::subxt::storage::address::Yes, + (), + > { + ::subxt::storage::address::Address::new_static( + "System", + "InherentsApplied", + (), + [ + 132u8, 249u8, 142u8, 252u8, 8u8, 103u8, 80u8, 120u8, 50u8, 6u8, 188u8, + 223u8, 101u8, 55u8, 165u8, 189u8, 172u8, 249u8, 165u8, 230u8, 183u8, + 109u8, 34u8, 65u8, 185u8, 150u8, 29u8, 8u8, 186u8, 129u8, 135u8, 239u8, + ], + ) + } #[doc = " The current weight for the block."] pub fn block_weight( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::block_weight::BlockWeight, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -4795,7 +4869,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "BlockWeight", - vec![], + (), [ 158u8, 46u8, 228u8, 89u8, 210u8, 214u8, 84u8, 154u8, 50u8, 68u8, 63u8, 62u8, 43u8, 42u8, 99u8, 27u8, 54u8, 42u8, 146u8, 44u8, 241u8, 216u8, @@ -4807,7 +4881,7 @@ pub mod api { pub fn all_extrinsics_len( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::all_extrinsics_len::AllExtrinsicsLen, ::subxt::storage::address::Yes, (), @@ -4816,7 +4890,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "AllExtrinsicsLen", - vec![], + (), [ 117u8, 86u8, 61u8, 243u8, 41u8, 51u8, 102u8, 214u8, 137u8, 100u8, 243u8, 185u8, 122u8, 174u8, 187u8, 117u8, 86u8, 189u8, 63u8, 135u8, @@ -4829,7 +4903,7 @@ pub mod api { pub fn block_hash_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::block_hash::BlockHash, (), ::subxt::storage::address::Yes, @@ -4838,7 +4912,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "BlockHash", - vec![], + (), [ 217u8, 32u8, 215u8, 253u8, 24u8, 182u8, 207u8, 178u8, 157u8, 24u8, 103u8, 100u8, 195u8, 165u8, 69u8, 152u8, 112u8, 181u8, 56u8, 192u8, @@ -4852,7 +4926,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::block_hash::BlockHash, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -4861,9 +4935,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "BlockHash", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 217u8, 32u8, 215u8, 253u8, 24u8, 182u8, 207u8, 178u8, 157u8, 24u8, 103u8, 100u8, 195u8, 165u8, 69u8, 152u8, 112u8, 181u8, 56u8, 192u8, @@ -4876,7 +4948,7 @@ pub mod api { pub fn extrinsic_data_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::extrinsic_data::ExtrinsicData, (), ::subxt::storage::address::Yes, @@ -4885,7 +4957,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "ExtrinsicData", - vec![], + (), [ 160u8, 180u8, 122u8, 18u8, 196u8, 26u8, 2u8, 37u8, 115u8, 232u8, 133u8, 220u8, 106u8, 245u8, 4u8, 129u8, 42u8, 84u8, 241u8, 45u8, 199u8, 179u8, @@ -4898,7 +4970,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::extrinsic_data::ExtrinsicData, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -4907,9 +4979,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "ExtrinsicData", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 160u8, 180u8, 122u8, 18u8, 196u8, 26u8, 2u8, 37u8, 115u8, 232u8, 133u8, 220u8, 106u8, 245u8, 4u8, 129u8, 42u8, 84u8, 241u8, 45u8, 199u8, 179u8, @@ -4921,7 +4991,7 @@ pub mod api { pub fn number( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::number::Number, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -4930,7 +5000,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "Number", - vec![], + (), [ 30u8, 194u8, 177u8, 90u8, 194u8, 232u8, 46u8, 180u8, 85u8, 129u8, 14u8, 9u8, 8u8, 8u8, 23u8, 95u8, 230u8, 5u8, 13u8, 105u8, 125u8, 2u8, 22u8, @@ -4942,7 +5012,7 @@ pub mod api { pub fn parent_hash( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::parent_hash::ParentHash, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -4951,7 +5021,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "ParentHash", - vec![], + (), [ 26u8, 130u8, 11u8, 216u8, 155u8, 71u8, 128u8, 170u8, 30u8, 153u8, 21u8, 192u8, 62u8, 93u8, 137u8, 80u8, 120u8, 81u8, 202u8, 94u8, 248u8, 125u8, @@ -4963,7 +5033,7 @@ pub mod api { pub fn digest( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::digest::Digest, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -4972,7 +5042,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "Digest", - vec![], + (), [ 61u8, 64u8, 237u8, 91u8, 145u8, 232u8, 17u8, 254u8, 181u8, 16u8, 234u8, 91u8, 51u8, 140u8, 254u8, 131u8, 98u8, 135u8, 21u8, 37u8, 251u8, 20u8, @@ -4990,7 +5060,7 @@ pub mod api { pub fn events( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::events::Events, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -4999,7 +5069,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "Events", - vec![], + (), [ 45u8, 244u8, 178u8, 49u8, 95u8, 31u8, 121u8, 90u8, 24u8, 201u8, 101u8, 147u8, 242u8, 227u8, 121u8, 238u8, 126u8, 20u8, 227u8, 97u8, 123u8, @@ -5012,7 +5082,7 @@ pub mod api { pub fn event_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::event_count::EventCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5021,7 +5091,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "EventCount", - vec![], + (), [ 175u8, 24u8, 252u8, 184u8, 210u8, 167u8, 146u8, 143u8, 164u8, 80u8, 151u8, 205u8, 189u8, 189u8, 55u8, 220u8, 47u8, 101u8, 181u8, 33u8, @@ -5043,7 +5113,7 @@ pub mod api { pub fn event_topics_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::event_topics::EventTopics, (), ::subxt::storage::address::Yes, @@ -5052,7 +5122,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "EventTopics", - vec![], + (), [ 40u8, 225u8, 14u8, 75u8, 44u8, 176u8, 76u8, 34u8, 143u8, 107u8, 69u8, 133u8, 114u8, 13u8, 172u8, 250u8, 141u8, 73u8, 12u8, 65u8, 217u8, 63u8, @@ -5074,7 +5144,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::event_topics::EventTopics, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5083,9 +5153,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "EventTopics", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 40u8, 225u8, 14u8, 75u8, 44u8, 176u8, 76u8, 34u8, 143u8, 107u8, 69u8, 133u8, 114u8, 13u8, 172u8, 250u8, 141u8, 73u8, 12u8, 65u8, 217u8, 63u8, @@ -5097,7 +5165,7 @@ pub mod api { pub fn last_runtime_upgrade( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::last_runtime_upgrade::LastRuntimeUpgrade, ::subxt::storage::address::Yes, (), @@ -5106,7 +5174,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "LastRuntimeUpgrade", - vec![], + (), [ 137u8, 29u8, 175u8, 75u8, 197u8, 208u8, 91u8, 207u8, 156u8, 87u8, 148u8, 68u8, 91u8, 140u8, 22u8, 233u8, 1u8, 229u8, 56u8, 34u8, 40u8, @@ -5118,7 +5186,7 @@ pub mod api { pub fn upgraded_to_u32_ref_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::upgraded_to_u32_ref_count::UpgradedToU32RefCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5127,7 +5195,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "UpgradedToU32RefCount", - vec![], + (), [ 229u8, 73u8, 9u8, 132u8, 186u8, 116u8, 151u8, 171u8, 145u8, 29u8, 34u8, 130u8, 52u8, 146u8, 124u8, 175u8, 79u8, 189u8, 147u8, 230u8, 234u8, @@ -5140,7 +5208,7 @@ pub mod api { pub fn upgraded_to_triple_ref_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::upgraded_to_triple_ref_count::UpgradedToTripleRefCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5149,7 +5217,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "UpgradedToTripleRefCount", - vec![], + (), [ 97u8, 66u8, 124u8, 243u8, 27u8, 167u8, 147u8, 81u8, 254u8, 201u8, 101u8, 24u8, 40u8, 231u8, 14u8, 179u8, 154u8, 163u8, 71u8, 81u8, 185u8, @@ -5162,7 +5230,7 @@ pub mod api { pub fn execution_phase( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::execution_phase::ExecutionPhase, ::subxt::storage::address::Yes, (), @@ -5171,7 +5239,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "ExecutionPhase", - vec![], + (), [ 191u8, 129u8, 100u8, 134u8, 126u8, 116u8, 154u8, 203u8, 220u8, 200u8, 0u8, 26u8, 161u8, 250u8, 133u8, 205u8, 146u8, 24u8, 5u8, 156u8, 158u8, @@ -5183,7 +5251,7 @@ pub mod api { pub fn authorized_upgrade( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::authorized_upgrade::AuthorizedUpgrade, ::subxt::storage::address::Yes, (), @@ -5192,7 +5260,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "System", "AuthorizedUpgrade", - vec![], + (), [ 165u8, 97u8, 27u8, 138u8, 2u8, 28u8, 55u8, 92u8, 96u8, 96u8, 168u8, 169u8, 55u8, 178u8, 44u8, 127u8, 58u8, 140u8, 206u8, 178u8, 1u8, 37u8, @@ -5267,7 +5335,7 @@ pub mod api { ], ) } - #[doc = " Get the chain's current version."] + #[doc = " Get the chain's in-code version."] pub fn version( &self, ) -> ::subxt::constants::Address @@ -5325,7 +5393,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::report_equivocation`]."] + #[doc = "Report authority equivocation/misbehavior. This method will verify"] + #[doc = "the equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence will"] + #[doc = "be reported."] pub struct ReportEquivocation { pub equivocation_proof: ::std::boxed::Box, @@ -5356,7 +5427,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::report_equivocation_unsigned`]."] + #[doc = "Report authority equivocation/misbehavior. This method will verify"] + #[doc = "the equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence will"] + #[doc = "be reported."] + #[doc = "This extrinsic must be called unsigned and it is expected that only"] + #[doc = "block authors will call it (validated in `ValidateUnsigned`), as such"] + #[doc = "if the block author is defined it will be defined as the equivocation"] + #[doc = "reporter."] pub struct ReportEquivocationUnsigned { pub equivocation_proof: ::std::boxed::Box, @@ -5387,7 +5465,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::plan_config_change`]."] + #[doc = "Plan an epoch config change. The epoch config change is recorded and will be enacted on"] + #[doc = "the next call to `enact_epoch_change`. The config will be activated one epoch after."] + #[doc = "Multiple calls to this method will replace any existing planned config change that had"] + #[doc = "not been enacted yet."] pub struct PlanConfigChange { pub config: plan_config_change::Config, } @@ -5403,7 +5484,10 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::report_equivocation`]."] + #[doc = "Report authority equivocation/misbehavior. This method will verify"] + #[doc = "the equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence will"] + #[doc = "be reported."] pub fn report_equivocation( &self, equivocation_proof: types::report_equivocation::EquivocationProof, @@ -5424,7 +5508,14 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::report_equivocation_unsigned`]."] + #[doc = "Report authority equivocation/misbehavior. This method will verify"] + #[doc = "the equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence will"] + #[doc = "be reported."] + #[doc = "This extrinsic must be called unsigned and it is expected that only"] + #[doc = "block authors will call it (validated in `ValidateUnsigned`), as such"] + #[doc = "if the block author is defined it will be defined as the equivocation"] + #[doc = "reporter."] pub fn report_equivocation_unsigned( &self, equivocation_proof: types::report_equivocation_unsigned::EquivocationProof, @@ -5444,7 +5535,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::plan_config_change`]."] + #[doc = "Plan an epoch config change. The epoch config change is recorded and will be enacted on"] + #[doc = "the next call to `enact_epoch_change`. The config will be activated one epoch after."] + #[doc = "Multiple calls to this method will replace any existing planned config change that had"] + #[doc = "not been enacted yet."] pub fn plan_config_change( &self, config: types::plan_config_change::Config, @@ -5563,7 +5657,7 @@ pub mod api { pub fn epoch_index( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::epoch_index::EpochIndex, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5572,7 +5666,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "EpochIndex", - vec![], + (), [ 32u8, 82u8, 130u8, 31u8, 190u8, 162u8, 237u8, 189u8, 104u8, 244u8, 30u8, 199u8, 179u8, 0u8, 161u8, 107u8, 72u8, 240u8, 201u8, 222u8, @@ -5585,7 +5679,7 @@ pub mod api { pub fn authorities( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::authorities::Authorities, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5594,7 +5688,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "Authorities", - vec![], + (), [ 67u8, 196u8, 244u8, 13u8, 246u8, 245u8, 198u8, 98u8, 81u8, 55u8, 182u8, 187u8, 214u8, 5u8, 181u8, 76u8, 251u8, 213u8, 144u8, 166u8, 36u8, @@ -5608,7 +5702,7 @@ pub mod api { pub fn genesis_slot( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::genesis_slot::GenesisSlot, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5617,7 +5711,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "GenesisSlot", - vec![], + (), [ 218u8, 174u8, 152u8, 76u8, 188u8, 214u8, 7u8, 88u8, 253u8, 187u8, 139u8, 234u8, 51u8, 28u8, 220u8, 57u8, 73u8, 1u8, 18u8, 205u8, 80u8, @@ -5630,7 +5724,7 @@ pub mod api { pub fn current_slot( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::current_slot::CurrentSlot, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5639,7 +5733,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "CurrentSlot", - vec![], + (), [ 112u8, 199u8, 115u8, 248u8, 217u8, 242u8, 45u8, 231u8, 178u8, 53u8, 236u8, 167u8, 219u8, 238u8, 81u8, 243u8, 39u8, 140u8, 68u8, 19u8, @@ -5661,7 +5755,7 @@ pub mod api { pub fn randomness( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::randomness::Randomness, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5670,7 +5764,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "Randomness", - vec![], + (), [ 36u8, 15u8, 52u8, 73u8, 195u8, 177u8, 186u8, 125u8, 134u8, 11u8, 103u8, 248u8, 170u8, 237u8, 105u8, 239u8, 168u8, 204u8, 147u8, 52u8, 15u8, @@ -5683,7 +5777,7 @@ pub mod api { pub fn pending_epoch_config_change( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::pending_epoch_config_change::PendingEpochConfigChange, ::subxt::storage::address::Yes, (), @@ -5692,7 +5786,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "PendingEpochConfigChange", - vec![], + (), [ 79u8, 216u8, 84u8, 210u8, 83u8, 149u8, 122u8, 160u8, 159u8, 164u8, 16u8, 134u8, 154u8, 104u8, 77u8, 254u8, 139u8, 18u8, 163u8, 59u8, 92u8, @@ -5704,7 +5798,7 @@ pub mod api { pub fn next_randomness( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::next_randomness::NextRandomness, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5713,7 +5807,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "NextRandomness", - vec![], + (), [ 96u8, 191u8, 139u8, 171u8, 144u8, 92u8, 33u8, 58u8, 23u8, 219u8, 164u8, 121u8, 59u8, 209u8, 112u8, 244u8, 50u8, 8u8, 14u8, 244u8, 103u8, 125u8, @@ -5725,7 +5819,7 @@ pub mod api { pub fn next_authorities( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::next_authorities::NextAuthorities, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5734,7 +5828,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "NextAuthorities", - vec![], + (), [ 116u8, 95u8, 126u8, 199u8, 237u8, 90u8, 202u8, 227u8, 247u8, 56u8, 201u8, 113u8, 239u8, 191u8, 151u8, 56u8, 156u8, 133u8, 61u8, 64u8, @@ -5755,7 +5849,7 @@ pub mod api { pub fn segment_index( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::segment_index::SegmentIndex, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5764,7 +5858,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "SegmentIndex", - vec![], + (), [ 145u8, 91u8, 142u8, 240u8, 184u8, 94u8, 68u8, 52u8, 130u8, 3u8, 75u8, 175u8, 155u8, 130u8, 66u8, 9u8, 150u8, 242u8, 123u8, 111u8, 124u8, @@ -5777,7 +5871,7 @@ pub mod api { pub fn under_construction_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::under_construction::UnderConstruction, (), ::subxt::storage::address::Yes, @@ -5786,7 +5880,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "UnderConstruction", - vec![], + (), [ 120u8, 120u8, 59u8, 247u8, 50u8, 6u8, 220u8, 14u8, 2u8, 76u8, 203u8, 244u8, 232u8, 144u8, 253u8, 191u8, 101u8, 35u8, 99u8, 85u8, 111u8, @@ -5799,7 +5893,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::under_construction::UnderConstruction, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5808,9 +5902,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "UnderConstruction", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 120u8, 120u8, 59u8, 247u8, 50u8, 6u8, 220u8, 14u8, 2u8, 76u8, 203u8, 244u8, 232u8, 144u8, 253u8, 191u8, 101u8, 35u8, 99u8, 85u8, 111u8, @@ -5823,7 +5915,7 @@ pub mod api { pub fn initialized( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::initialized::Initialized, ::subxt::storage::address::Yes, (), @@ -5832,7 +5924,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "Initialized", - vec![], + (), [ 169u8, 217u8, 237u8, 78u8, 186u8, 202u8, 206u8, 213u8, 54u8, 85u8, 206u8, 166u8, 22u8, 138u8, 236u8, 60u8, 211u8, 169u8, 12u8, 183u8, @@ -5848,7 +5940,7 @@ pub mod api { pub fn author_vrf_randomness( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::author_vrf_randomness::AuthorVrfRandomness, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5857,7 +5949,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "AuthorVrfRandomness", - vec![], + (), [ 160u8, 157u8, 62u8, 48u8, 196u8, 136u8, 63u8, 132u8, 155u8, 183u8, 91u8, 201u8, 146u8, 29u8, 192u8, 142u8, 168u8, 152u8, 197u8, 233u8, @@ -5874,7 +5966,7 @@ pub mod api { pub fn epoch_start( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::epoch_start::EpochStart, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5883,7 +5975,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "EpochStart", - vec![], + (), [ 144u8, 133u8, 140u8, 56u8, 241u8, 203u8, 199u8, 123u8, 244u8, 126u8, 196u8, 151u8, 214u8, 204u8, 243u8, 244u8, 210u8, 198u8, 174u8, 126u8, @@ -5900,7 +5992,7 @@ pub mod api { pub fn lateness( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::lateness::Lateness, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5909,7 +6001,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "Lateness", - vec![], + (), [ 229u8, 214u8, 133u8, 149u8, 32u8, 159u8, 26u8, 22u8, 252u8, 131u8, 200u8, 191u8, 231u8, 176u8, 178u8, 127u8, 33u8, 212u8, 139u8, 220u8, @@ -5923,7 +6015,7 @@ pub mod api { pub fn epoch_config( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::epoch_config::EpochConfig, ::subxt::storage::address::Yes, (), @@ -5932,7 +6024,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "EpochConfig", - vec![], + (), [ 151u8, 58u8, 93u8, 2u8, 19u8, 98u8, 41u8, 144u8, 241u8, 70u8, 195u8, 37u8, 126u8, 241u8, 111u8, 65u8, 16u8, 228u8, 111u8, 220u8, 241u8, @@ -5946,7 +6038,7 @@ pub mod api { pub fn next_epoch_config( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::next_epoch_config::NextEpochConfig, ::subxt::storage::address::Yes, (), @@ -5955,7 +6047,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "NextEpochConfig", - vec![], + (), [ 65u8, 54u8, 74u8, 141u8, 193u8, 124u8, 130u8, 238u8, 106u8, 27u8, 221u8, 189u8, 103u8, 53u8, 39u8, 243u8, 212u8, 216u8, 75u8, 185u8, @@ -5975,7 +6067,7 @@ pub mod api { pub fn skipped_epochs( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::skipped_epochs::SkippedEpochs, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -5984,7 +6076,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Babe", "SkippedEpochs", - vec![], + (), [ 120u8, 167u8, 144u8, 97u8, 41u8, 216u8, 103u8, 90u8, 3u8, 86u8, 196u8, 35u8, 160u8, 150u8, 144u8, 233u8, 128u8, 35u8, 119u8, 66u8, 6u8, 63u8, @@ -6088,7 +6180,25 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set`]."] + #[doc = "Set the current time."] + #[doc = ""] + #[doc = "This call should be invoked exactly once per block. It will panic at the finalization"] + #[doc = "phase, if this call hasn't been invoked by that time."] + #[doc = ""] + #[doc = "The timestamp should be greater than the previous one by the amount specified by"] + #[doc = "[`Config::MinimumPeriod`]."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _None_."] + #[doc = ""] + #[doc = "This dispatch class is _Mandatory_ to ensure it gets executed in the block. Be aware"] + #[doc = "that changing the complexity of this call could result exhausting the resources in a"] + #[doc = "block to execute any other calls."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)` (Note that implementations of `OnTimestampSet` must also be `O(1)`)"] + #[doc = "- 1 storage read and 1 storage mutation (codec `O(1)` because of `DidUpdate::take` in"] + #[doc = " `on_finalize`)"] + #[doc = "- 1 event handler `on_timestamp_set`. Must be `O(1)`."] pub struct Set { #[codec(compact)] pub now: set::Now, @@ -6104,7 +6214,25 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::set`]."] + #[doc = "Set the current time."] + #[doc = ""] + #[doc = "This call should be invoked exactly once per block. It will panic at the finalization"] + #[doc = "phase, if this call hasn't been invoked by that time."] + #[doc = ""] + #[doc = "The timestamp should be greater than the previous one by the amount specified by"] + #[doc = "[`Config::MinimumPeriod`]."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _None_."] + #[doc = ""] + #[doc = "This dispatch class is _Mandatory_ to ensure it gets executed in the block. Be aware"] + #[doc = "that changing the complexity of this call could result exhausting the resources in a"] + #[doc = "block to execute any other calls."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)` (Note that implementations of `OnTimestampSet` must also be `O(1)`)"] + #[doc = "- 1 storage read and 1 storage mutation (codec `O(1)` because of `DidUpdate::take` in"] + #[doc = " `on_finalize`)"] + #[doc = "- 1 event handler `on_timestamp_set`. Must be `O(1)`."] pub fn set(&self, now: types::set::Now) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Timestamp", @@ -6138,7 +6266,7 @@ pub mod api { pub fn now( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::now::Now, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -6147,7 +6275,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Timestamp", "Now", - vec![], + (), [ 44u8, 50u8, 80u8, 30u8, 195u8, 146u8, 123u8, 238u8, 8u8, 163u8, 187u8, 92u8, 61u8, 39u8, 51u8, 29u8, 173u8, 169u8, 217u8, 158u8, 85u8, 187u8, @@ -6162,7 +6290,7 @@ pub mod api { pub fn did_update( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::did_update::DidUpdate, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -6171,7 +6299,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Timestamp", "DidUpdate", - vec![], + (), [ 229u8, 175u8, 246u8, 102u8, 237u8, 158u8, 212u8, 229u8, 238u8, 214u8, 205u8, 160u8, 164u8, 252u8, 195u8, 75u8, 139u8, 110u8, 22u8, 34u8, @@ -6232,7 +6360,18 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::claim`]."] + #[doc = "Assign an previously unassigned index."] + #[doc = ""] + #[doc = "Payment: `Deposit` is reserved from the sender account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `index`: the index to be claimed. This must not be in use."] + #[doc = ""] + #[doc = "Emits `IndexAssigned` if successful."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub struct Claim { pub index: claim::Index, } @@ -6254,7 +6393,18 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::transfer`]."] + #[doc = "Assign an index already owned by the sender to another account. The balance reservation"] + #[doc = "is effectively transferred to the new account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `index`: the index to be re-assigned. This must be owned by the sender."] + #[doc = "- `new`: the new owner of the index. This function is a no-op if it is equal to sender."] + #[doc = ""] + #[doc = "Emits `IndexAssigned` if successful."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub struct Transfer { pub new: transfer::New, pub index: transfer::Index, @@ -6278,7 +6428,18 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::free`]."] + #[doc = "Free up an index owned by the sender."] + #[doc = ""] + #[doc = "Payment: Any previous deposit placed for the index is unreserved in the sender account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must own the index."] + #[doc = ""] + #[doc = "- `index`: the index to be freed. This must be owned by the sender."] + #[doc = ""] + #[doc = "Emits `IndexFreed` if successful."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub struct Free { pub index: free::Index, } @@ -6300,7 +6461,19 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_transfer`]."] + #[doc = "Force an index to an account. This doesn't require a deposit. If the index is already"] + #[doc = "held, then any deposit is reimbursed to its current owner."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] + #[doc = ""] + #[doc = "- `index`: the index to be (re-)assigned."] + #[doc = "- `new`: the new owner of the index. This function is a no-op if it is equal to sender."] + #[doc = "- `freeze`: if set to `true`, will freeze the index so it cannot be transferred."] + #[doc = ""] + #[doc = "Emits `IndexAssigned` if successful."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub struct ForceTransfer { pub new: force_transfer::New, pub index: force_transfer::Index, @@ -6326,7 +6499,18 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::freeze`]."] + #[doc = "Freeze an index so it will always point to the sender account. This consumes the"] + #[doc = "deposit."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the signing account must have a"] + #[doc = "non-frozen account `index`."] + #[doc = ""] + #[doc = "- `index`: the index to be frozen in place."] + #[doc = ""] + #[doc = "Emits `IndexFrozen` if successful."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub struct Freeze { pub index: freeze::Index, } @@ -6341,7 +6525,18 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::claim`]."] + #[doc = "Assign an previously unassigned index."] + #[doc = ""] + #[doc = "Payment: `Deposit` is reserved from the sender account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `index`: the index to be claimed. This must not be in use."] + #[doc = ""] + #[doc = "Emits `IndexAssigned` if successful."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub fn claim( &self, index: types::claim::Index, @@ -6357,7 +6552,18 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::transfer`]."] + #[doc = "Assign an index already owned by the sender to another account. The balance reservation"] + #[doc = "is effectively transferred to the new account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `index`: the index to be re-assigned. This must be owned by the sender."] + #[doc = "- `new`: the new owner of the index. This function is a no-op if it is equal to sender."] + #[doc = ""] + #[doc = "Emits `IndexAssigned` if successful."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub fn transfer( &self, new: types::transfer::New, @@ -6375,7 +6581,18 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::free`]."] + #[doc = "Free up an index owned by the sender."] + #[doc = ""] + #[doc = "Payment: Any previous deposit placed for the index is unreserved in the sender account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must own the index."] + #[doc = ""] + #[doc = "- `index`: the index to be freed. This must be owned by the sender."] + #[doc = ""] + #[doc = "Emits `IndexFreed` if successful."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub fn free(&self, index: types::free::Index) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Indices", @@ -6389,7 +6606,19 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_transfer`]."] + #[doc = "Force an index to an account. This doesn't require a deposit. If the index is already"] + #[doc = "held, then any deposit is reimbursed to its current owner."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] + #[doc = ""] + #[doc = "- `index`: the index to be (re-)assigned."] + #[doc = "- `new`: the new owner of the index. This function is a no-op if it is equal to sender."] + #[doc = "- `freeze`: if set to `true`, will freeze the index so it cannot be transferred."] + #[doc = ""] + #[doc = "Emits `IndexAssigned` if successful."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub fn force_transfer( &self, new: types::force_transfer::New, @@ -6408,7 +6637,18 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::freeze`]."] + #[doc = "Freeze an index so it will always point to the sender account. This consumes the"] + #[doc = "deposit."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the signing account must have a"] + #[doc = "non-frozen account `index`."] + #[doc = ""] + #[doc = "- `index`: the index to be frozen in place."] + #[doc = ""] + #[doc = "Emits `IndexFrozen` if successful."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub fn freeze( &self, index: types::freeze::Index, @@ -6522,7 +6762,7 @@ pub mod api { pub fn accounts_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::accounts::Accounts, (), (), @@ -6531,7 +6771,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Indices", "Accounts", - vec![], + (), [ 48u8, 189u8, 43u8, 119u8, 32u8, 168u8, 28u8, 12u8, 245u8, 81u8, 119u8, 182u8, 23u8, 201u8, 33u8, 147u8, 128u8, 171u8, 155u8, 134u8, 71u8, @@ -6545,7 +6785,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::accounts::Accounts, ::subxt::storage::address::Yes, (), @@ -6554,9 +6794,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Indices", "Accounts", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 48u8, 189u8, 43u8, 119u8, 32u8, 168u8, 28u8, 12u8, 245u8, 81u8, 119u8, 182u8, 23u8, 201u8, 33u8, 147u8, 128u8, 171u8, 155u8, 134u8, 71u8, @@ -6609,7 +6847,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::transfer_allow_death`]."] + #[doc = "Transfer some liquid free balance to another account."] + #[doc = ""] + #[doc = "`transfer_allow_death` will set the `FreeBalance` of the sender and receiver."] + #[doc = "If the sender's account is below the existential deposit as a result"] + #[doc = "of the transfer, the account will be reaped."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be `Signed` by the transactor."] pub struct TransferAllowDeath { pub dest: transfer_allow_death::Dest, #[codec(compact)] @@ -6634,7 +6878,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_transfer`]."] + #[doc = "Exactly as `transfer_allow_death`, except the origin must be root and the source account"] + #[doc = "may be specified."] pub struct ForceTransfer { pub source: force_transfer::Source, pub dest: force_transfer::Dest, @@ -6661,7 +6906,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::transfer_keep_alive`]."] + #[doc = "Same as the [`transfer_allow_death`] call, but with a check that the transfer will not"] + #[doc = "kill the origin account."] + #[doc = ""] + #[doc = "99% of the time you want [`transfer_allow_death`] instead."] + #[doc = ""] + #[doc = "[`transfer_allow_death`]: struct.Pallet.html#method.transfer"] pub struct TransferKeepAlive { pub dest: transfer_keep_alive::Dest, #[codec(compact)] @@ -6686,7 +6936,21 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::transfer_all`]."] + #[doc = "Transfer the entire transferable balance from the caller account."] + #[doc = ""] + #[doc = "NOTE: This function only attempts to transfer _transferable_ balances. This means that"] + #[doc = "any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be"] + #[doc = "transferred by this function. To ensure that this function results in a killed account,"] + #[doc = "you might need to prepare the account by removing any reference counters, storage"] + #[doc = "deposits, etc..."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be Signed."] + #[doc = ""] + #[doc = "- `dest`: The recipient of the transfer."] + #[doc = "- `keep_alive`: A boolean to determine if the `transfer_all` operation should send all"] + #[doc = " of the funds the account has, causing the sender account to be killed (false), or"] + #[doc = " transfer everything except at least the existential deposit, which will guarantee to"] + #[doc = " keep the sender account alive (true)."] pub struct TransferAll { pub dest: transfer_all::Dest, pub keep_alive: transfer_all::KeepAlive, @@ -6710,7 +6974,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_unreserve`]."] + #[doc = "Unreserve some balance from a user by force."] + #[doc = ""] + #[doc = "Can only be called by ROOT."] pub struct ForceUnreserve { pub who: force_unreserve::Who, pub amount: force_unreserve::Amount, @@ -6734,7 +7000,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::upgrade_accounts`]."] + #[doc = "Upgrade a specified account."] + #[doc = ""] + #[doc = "- `origin`: Must be `Signed`."] + #[doc = "- `who`: The account to be upgraded."] + #[doc = ""] + #[doc = "This will waive the transaction fee if at least all but 10% of the accounts needed to"] + #[doc = "be upgraded. (We let some not have to be upgraded just in order to allow for the"] + #[doc = "possibililty of churn)."] pub struct UpgradeAccounts { pub who: upgrade_accounts::Who, } @@ -6756,7 +7029,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_set_balance`]."] + #[doc = "Set the regular balance of a given account."] + #[doc = ""] + #[doc = "The dispatch origin for this call is `root`."] pub struct ForceSetBalance { pub who: force_set_balance::Who, #[codec(compact)] @@ -6781,7 +7056,11 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_adjust_total_issuance`]."] + #[doc = "Adjust the total issuance in a saturating way."] + #[doc = ""] + #[doc = "Can only be called by root and always needs a positive `delta`."] + #[doc = ""] + #[doc = "# Example"] pub struct ForceAdjustTotalIssuance { pub direction: force_adjust_total_issuance::Direction, #[codec(compact)] @@ -6799,7 +7078,13 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::transfer_allow_death`]."] + #[doc = "Transfer some liquid free balance to another account."] + #[doc = ""] + #[doc = "`transfer_allow_death` will set the `FreeBalance` of the sender and receiver."] + #[doc = "If the sender's account is below the existential deposit as a result"] + #[doc = "of the transfer, the account will be reaped."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be `Signed` by the transactor."] pub fn transfer_allow_death( &self, dest: types::transfer_allow_death::Dest, @@ -6817,7 +7102,8 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_transfer`]."] + #[doc = "Exactly as `transfer_allow_death`, except the origin must be root and the source account"] + #[doc = "may be specified."] pub fn force_transfer( &self, source: types::force_transfer::Source, @@ -6839,7 +7125,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::transfer_keep_alive`]."] + #[doc = "Same as the [`transfer_allow_death`] call, but with a check that the transfer will not"] + #[doc = "kill the origin account."] + #[doc = ""] + #[doc = "99% of the time you want [`transfer_allow_death`] instead."] + #[doc = ""] + #[doc = "[`transfer_allow_death`]: struct.Pallet.html#method.transfer"] pub fn transfer_keep_alive( &self, dest: types::transfer_keep_alive::Dest, @@ -6856,7 +7147,21 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::transfer_all`]."] + #[doc = "Transfer the entire transferable balance from the caller account."] + #[doc = ""] + #[doc = "NOTE: This function only attempts to transfer _transferable_ balances. This means that"] + #[doc = "any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be"] + #[doc = "transferred by this function. To ensure that this function results in a killed account,"] + #[doc = "you might need to prepare the account by removing any reference counters, storage"] + #[doc = "deposits, etc..."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be Signed."] + #[doc = ""] + #[doc = "- `dest`: The recipient of the transfer."] + #[doc = "- `keep_alive`: A boolean to determine if the `transfer_all` operation should send all"] + #[doc = " of the funds the account has, causing the sender account to be killed (false), or"] + #[doc = " transfer everything except at least the existential deposit, which will guarantee to"] + #[doc = " keep the sender account alive (true)."] pub fn transfer_all( &self, dest: types::transfer_all::Dest, @@ -6873,7 +7178,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_unreserve`]."] + #[doc = "Unreserve some balance from a user by force."] + #[doc = ""] + #[doc = "Can only be called by ROOT."] pub fn force_unreserve( &self, who: types::force_unreserve::Who, @@ -6891,7 +7198,14 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::upgrade_accounts`]."] + #[doc = "Upgrade a specified account."] + #[doc = ""] + #[doc = "- `origin`: Must be `Signed`."] + #[doc = "- `who`: The account to be upgraded."] + #[doc = ""] + #[doc = "This will waive the transaction fee if at least all but 10% of the accounts needed to"] + #[doc = "be upgraded. (We let some not have to be upgraded just in order to allow for the"] + #[doc = "possibililty of churn)."] pub fn upgrade_accounts( &self, who: types::upgrade_accounts::Who, @@ -6907,7 +7221,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_set_balance`]."] + #[doc = "Set the regular balance of a given account."] + #[doc = ""] + #[doc = "The dispatch origin for this call is `root`."] pub fn force_set_balance( &self, who: types::force_set_balance::Who, @@ -6924,7 +7240,11 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_adjust_total_issuance`]."] + #[doc = "Adjust the total issuance in a saturating way."] + #[doc = ""] + #[doc = "Can only be called by root and always needs a positive `delta`."] + #[doc = ""] + #[doc = "# Example"] pub fn force_adjust_total_issuance( &self, direction: types::force_adjust_total_issuance::Direction, @@ -7545,7 +7865,7 @@ pub mod api { pub fn total_issuance( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::total_issuance::TotalIssuance, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -7554,7 +7874,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Balances", "TotalIssuance", - vec![], + (), [ 116u8, 70u8, 119u8, 194u8, 69u8, 37u8, 116u8, 206u8, 171u8, 70u8, 171u8, 210u8, 226u8, 111u8, 184u8, 204u8, 206u8, 11u8, 68u8, 72u8, @@ -7567,7 +7887,7 @@ pub mod api { pub fn inactive_issuance( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::inactive_issuance::InactiveIssuance, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -7576,7 +7896,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Balances", "InactiveIssuance", - vec![], + (), [ 212u8, 185u8, 19u8, 50u8, 250u8, 72u8, 173u8, 50u8, 4u8, 104u8, 161u8, 249u8, 77u8, 247u8, 204u8, 248u8, 11u8, 18u8, 57u8, 4u8, 82u8, 110u8, @@ -7611,7 +7931,7 @@ pub mod api { pub fn account_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::account::Account, (), ::subxt::storage::address::Yes, @@ -7620,7 +7940,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Balances", "Account", - vec![], + (), [ 213u8, 38u8, 200u8, 69u8, 218u8, 0u8, 112u8, 181u8, 160u8, 23u8, 96u8, 90u8, 3u8, 88u8, 126u8, 22u8, 103u8, 74u8, 64u8, 69u8, 29u8, 247u8, @@ -7656,7 +7976,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::account::Account, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -7665,9 +7985,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Balances", "Account", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 213u8, 38u8, 200u8, 69u8, 218u8, 0u8, 112u8, 181u8, 160u8, 23u8, 96u8, 90u8, 3u8, 88u8, 126u8, 22u8, 103u8, 74u8, 64u8, 69u8, 29u8, 247u8, @@ -7680,7 +7998,7 @@ pub mod api { pub fn locks_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::locks::Locks, (), ::subxt::storage::address::Yes, @@ -7689,7 +8007,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Balances", "Locks", - vec![], + (), [ 10u8, 223u8, 55u8, 0u8, 249u8, 69u8, 168u8, 41u8, 75u8, 35u8, 120u8, 167u8, 18u8, 132u8, 9u8, 20u8, 91u8, 51u8, 27u8, 69u8, 136u8, 187u8, @@ -7703,7 +8021,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::locks::Locks, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -7712,9 +8030,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Balances", "Locks", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 10u8, 223u8, 55u8, 0u8, 249u8, 69u8, 168u8, 41u8, 75u8, 35u8, 120u8, 167u8, 18u8, 132u8, 9u8, 20u8, 91u8, 51u8, 27u8, 69u8, 136u8, 187u8, @@ -7726,7 +8042,7 @@ pub mod api { pub fn reserves_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::reserves::Reserves, (), ::subxt::storage::address::Yes, @@ -7735,7 +8051,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Balances", "Reserves", - vec![], + (), [ 112u8, 10u8, 241u8, 77u8, 64u8, 187u8, 106u8, 159u8, 13u8, 153u8, 140u8, 178u8, 182u8, 50u8, 1u8, 55u8, 149u8, 92u8, 196u8, 229u8, 170u8, @@ -7748,7 +8064,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::reserves::Reserves, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -7757,9 +8073,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Balances", "Reserves", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 112u8, 10u8, 241u8, 77u8, 64u8, 187u8, 106u8, 159u8, 13u8, 153u8, 140u8, 178u8, 182u8, 50u8, 1u8, 55u8, 149u8, 92u8, 196u8, 229u8, 170u8, @@ -7771,7 +8085,7 @@ pub mod api { pub fn holds_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::holds::Holds, (), ::subxt::storage::address::Yes, @@ -7780,7 +8094,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Balances", "Holds", - vec![], + (), [ 181u8, 39u8, 29u8, 45u8, 45u8, 198u8, 129u8, 210u8, 189u8, 183u8, 121u8, 125u8, 57u8, 90u8, 95u8, 107u8, 51u8, 13u8, 22u8, 105u8, 191u8, @@ -7794,7 +8108,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::holds::Holds, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -7803,9 +8117,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Balances", "Holds", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 181u8, 39u8, 29u8, 45u8, 45u8, 198u8, 129u8, 210u8, 189u8, 183u8, 121u8, 125u8, 57u8, 90u8, 95u8, 107u8, 51u8, 13u8, 22u8, 105u8, 191u8, @@ -7818,7 +8130,7 @@ pub mod api { pub fn freezes_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::freezes::Freezes, (), ::subxt::storage::address::Yes, @@ -7827,7 +8139,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Balances", "Freezes", - vec![], + (), [ 69u8, 49u8, 165u8, 76u8, 135u8, 142u8, 179u8, 118u8, 50u8, 109u8, 53u8, 112u8, 110u8, 94u8, 30u8, 93u8, 173u8, 38u8, 27u8, 142u8, 19u8, 5u8, @@ -7840,7 +8152,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::freezes::Freezes, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -7849,9 +8161,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Balances", "Freezes", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 69u8, 49u8, 165u8, 76u8, 135u8, 142u8, 179u8, 118u8, 50u8, 109u8, 53u8, 112u8, 110u8, 94u8, 30u8, 93u8, 173u8, 38u8, 27u8, 142u8, 19u8, 5u8, @@ -7983,7 +8293,7 @@ pub mod api { pub fn next_fee_multiplier( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::next_fee_multiplier::NextFeeMultiplier, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -7992,7 +8302,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "TransactionPayment", "NextFeeMultiplier", - vec![], + (), [ 247u8, 39u8, 81u8, 170u8, 225u8, 226u8, 82u8, 147u8, 34u8, 113u8, 147u8, 213u8, 59u8, 80u8, 139u8, 35u8, 36u8, 196u8, 152u8, 19u8, 9u8, @@ -8004,7 +8314,7 @@ pub mod api { pub fn storage_version( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::storage_version::StorageVersion, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -8013,7 +8323,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "TransactionPayment", "StorageVersion", - vec![], + (), [ 105u8, 243u8, 158u8, 241u8, 159u8, 231u8, 253u8, 6u8, 4u8, 32u8, 85u8, 178u8, 126u8, 31u8, 203u8, 134u8, 154u8, 38u8, 122u8, 155u8, 150u8, @@ -8084,7 +8394,7 @@ pub mod api { pub fn author( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::author::Author, ::subxt::storage::address::Yes, (), @@ -8093,7 +8403,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Authorship", "Author", - vec![], + (), [ 247u8, 192u8, 118u8, 227u8, 47u8, 20u8, 203u8, 199u8, 216u8, 87u8, 220u8, 50u8, 166u8, 61u8, 168u8, 213u8, 253u8, 62u8, 202u8, 199u8, @@ -8164,7 +8474,7 @@ pub mod api { pub fn reports_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::reports::Reports, (), (), @@ -8173,7 +8483,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Offences", "Reports", - vec![], + (), [ 255u8, 234u8, 162u8, 48u8, 243u8, 210u8, 198u8, 231u8, 218u8, 142u8, 167u8, 10u8, 232u8, 223u8, 239u8, 55u8, 74u8, 23u8, 14u8, 236u8, 88u8, @@ -8187,7 +8497,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::reports::Reports, ::subxt::storage::address::Yes, (), @@ -8196,9 +8506,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Offences", "Reports", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 255u8, 234u8, 162u8, 48u8, 243u8, 210u8, 198u8, 231u8, 218u8, 142u8, 167u8, 10u8, 232u8, 223u8, 239u8, 55u8, 74u8, 23u8, 14u8, 236u8, 88u8, @@ -8211,7 +8519,7 @@ pub mod api { pub fn concurrent_reports_index_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::concurrent_reports_index::ConcurrentReportsIndex, (), ::subxt::storage::address::Yes, @@ -8220,7 +8528,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Offences", "ConcurrentReportsIndex", - vec![], + (), [ 170u8, 186u8, 72u8, 29u8, 251u8, 38u8, 193u8, 195u8, 109u8, 86u8, 0u8, 241u8, 20u8, 235u8, 108u8, 126u8, 215u8, 82u8, 73u8, 113u8, 199u8, @@ -8234,7 +8542,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::concurrent_reports_index::Param0, + >, types::concurrent_reports_index::ConcurrentReportsIndex, (), ::subxt::storage::address::Yes, @@ -8243,9 +8553,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Offences", "ConcurrentReportsIndex", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 170u8, 186u8, 72u8, 29u8, 251u8, 38u8, 193u8, 195u8, 109u8, 86u8, 0u8, 241u8, 20u8, 235u8, 108u8, 126u8, 215u8, 82u8, 73u8, 113u8, 199u8, @@ -8260,7 +8568,14 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey< + types::concurrent_reports_index::Param0, + >, + ::subxt::storage::address::StaticStorageKey< + types::concurrent_reports_index::Param1, + >, + ), types::concurrent_reports_index::ConcurrentReportsIndex, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -8269,10 +8584,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Offences", "ConcurrentReportsIndex", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 170u8, 186u8, 72u8, 29u8, 251u8, 38u8, 193u8, 195u8, 109u8, 86u8, 0u8, 241u8, 20u8, 235u8, 108u8, 126u8, 215u8, 82u8, 73u8, 113u8, 199u8, @@ -8307,7 +8622,7 @@ pub mod api { pub fn historical_sessions_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::historical_sessions::HistoricalSessions, (), (), @@ -8316,7 +8631,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Historical", "HistoricalSessions", - vec![], + (), [ 9u8, 138u8, 247u8, 141u8, 178u8, 146u8, 124u8, 81u8, 162u8, 211u8, 205u8, 149u8, 222u8, 254u8, 253u8, 188u8, 170u8, 242u8, 218u8, 41u8, @@ -8330,7 +8645,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::historical_sessions::HistoricalSessions, ::subxt::storage::address::Yes, (), @@ -8339,9 +8654,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Historical", "HistoricalSessions", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 9u8, 138u8, 247u8, 141u8, 178u8, 146u8, 124u8, 81u8, 162u8, 211u8, 205u8, 149u8, 222u8, 254u8, 253u8, 188u8, 170u8, 242u8, 218u8, 41u8, @@ -8354,7 +8667,7 @@ pub mod api { pub fn stored_range( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::stored_range::StoredRange, ::subxt::storage::address::Yes, (), @@ -8363,7 +8676,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Historical", "StoredRange", - vec![], + (), [ 134u8, 32u8, 250u8, 13u8, 201u8, 25u8, 54u8, 243u8, 231u8, 81u8, 252u8, 231u8, 68u8, 217u8, 235u8, 43u8, 22u8, 223u8, 220u8, 133u8, 198u8, @@ -8397,7 +8710,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_keys`]."] + #[doc = "Sets the session key(s) of the function caller to `keys`."] + #[doc = "Allows an account to set its session key prior to becoming a validator."] + #[doc = "This doesn't take effect until the next session."] + #[doc = ""] + #[doc = "The dispatch origin of this function must be signed."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`. Actual cost depends on the number of length of `T::Keys::key_ids()` which is"] + #[doc = " fixed."] pub struct SetKeys { pub keys: set_keys::Keys, pub proof: set_keys::Proof, @@ -8421,7 +8742,18 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::purge_keys`]."] + #[doc = "Removes any session key(s) of the function caller."] + #[doc = ""] + #[doc = "This doesn't take effect until the next session."] + #[doc = ""] + #[doc = "The dispatch origin of this function must be Signed and the account must be either be"] + #[doc = "convertible to a validator ID using the chain's typical addressing system (this usually"] + #[doc = "means being a controller account) or directly convertible into a validator ID (which"] + #[doc = "usually means being a stash account)."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)` in number of key types. Actual cost depends on the number of length of"] + #[doc = " `T::Keys::key_ids()` which is fixed."] pub struct PurgeKeys; impl ::subxt::blocks::StaticExtrinsic for PurgeKeys { const PALLET: &'static str = "Session"; @@ -8430,7 +8762,15 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::set_keys`]."] + #[doc = "Sets the session key(s) of the function caller to `keys`."] + #[doc = "Allows an account to set its session key prior to becoming a validator."] + #[doc = "This doesn't take effect until the next session."] + #[doc = ""] + #[doc = "The dispatch origin of this function must be signed."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`. Actual cost depends on the number of length of `T::Keys::key_ids()` which is"] + #[doc = " fixed."] pub fn set_keys( &self, keys: types::set_keys::Keys, @@ -8448,7 +8788,18 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::purge_keys`]."] + #[doc = "Removes any session key(s) of the function caller."] + #[doc = ""] + #[doc = "This doesn't take effect until the next session."] + #[doc = ""] + #[doc = "The dispatch origin of this function must be Signed and the account must be either be"] + #[doc = "convertible to a validator ID using the chain's typical addressing system (this usually"] + #[doc = "means being a controller account) or directly convertible into a validator ID (which"] + #[doc = "usually means being a stash account)."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)` in number of key types. Actual cost depends on the number of length of"] + #[doc = " `T::Keys::key_ids()` which is fixed."] pub fn purge_keys(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Session", @@ -8537,7 +8888,7 @@ pub mod api { pub fn validators( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::validators::Validators, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -8546,7 +8897,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Session", "Validators", - vec![], + (), [ 50u8, 86u8, 154u8, 222u8, 249u8, 209u8, 156u8, 22u8, 155u8, 25u8, 133u8, 194u8, 210u8, 50u8, 38u8, 28u8, 139u8, 201u8, 90u8, 139u8, @@ -8559,7 +8910,7 @@ pub mod api { pub fn current_index( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::current_index::CurrentIndex, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -8568,7 +8919,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Session", "CurrentIndex", - vec![], + (), [ 167u8, 151u8, 125u8, 150u8, 159u8, 21u8, 78u8, 217u8, 237u8, 183u8, 135u8, 65u8, 187u8, 114u8, 188u8, 206u8, 16u8, 32u8, 69u8, 208u8, @@ -8582,7 +8933,7 @@ pub mod api { pub fn queued_changed( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::queued_changed::QueuedChanged, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -8591,7 +8942,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Session", "QueuedChanged", - vec![], + (), [ 184u8, 137u8, 224u8, 137u8, 31u8, 236u8, 95u8, 164u8, 102u8, 225u8, 198u8, 227u8, 140u8, 37u8, 113u8, 57u8, 59u8, 4u8, 202u8, 102u8, 117u8, @@ -8605,7 +8956,7 @@ pub mod api { pub fn queued_keys( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::queued_keys::QueuedKeys, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -8614,7 +8965,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Session", "QueuedKeys", - vec![], + (), [ 123u8, 8u8, 241u8, 219u8, 141u8, 50u8, 254u8, 247u8, 130u8, 71u8, 105u8, 18u8, 149u8, 204u8, 28u8, 104u8, 184u8, 6u8, 165u8, 31u8, 153u8, @@ -8631,7 +8982,7 @@ pub mod api { pub fn disabled_validators( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::disabled_validators::DisabledValidators, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -8640,7 +8991,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Session", "DisabledValidators", - vec![], + (), [ 213u8, 19u8, 168u8, 234u8, 187u8, 200u8, 180u8, 97u8, 234u8, 189u8, 36u8, 233u8, 158u8, 184u8, 45u8, 35u8, 129u8, 213u8, 133u8, 8u8, 104u8, @@ -8652,7 +9003,7 @@ pub mod api { pub fn next_keys_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::next_keys::NextKeys, (), (), @@ -8661,7 +9012,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Session", "NextKeys", - vec![], + (), [ 13u8, 219u8, 184u8, 220u8, 199u8, 150u8, 34u8, 166u8, 125u8, 46u8, 26u8, 160u8, 113u8, 243u8, 227u8, 6u8, 121u8, 176u8, 222u8, 250u8, @@ -8675,7 +9026,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::next_keys::NextKeys, ::subxt::storage::address::Yes, (), @@ -8684,9 +9035,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Session", "NextKeys", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 13u8, 219u8, 184u8, 220u8, 199u8, 150u8, 34u8, 166u8, 125u8, 46u8, 26u8, 160u8, 113u8, 243u8, 227u8, 6u8, 121u8, 176u8, 222u8, 250u8, @@ -8699,7 +9048,7 @@ pub mod api { pub fn key_owner_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::key_owner::KeyOwner, (), (), @@ -8708,7 +9057,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Session", "KeyOwner", - vec![], + (), [ 217u8, 204u8, 21u8, 114u8, 247u8, 129u8, 32u8, 242u8, 93u8, 91u8, 253u8, 253u8, 248u8, 90u8, 12u8, 202u8, 195u8, 25u8, 18u8, 100u8, @@ -8722,7 +9071,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::key_owner::KeyOwner, (), (), @@ -8731,9 +9080,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Session", "KeyOwner", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 217u8, 204u8, 21u8, 114u8, 247u8, 129u8, 32u8, 242u8, 93u8, 91u8, 253u8, 253u8, 248u8, 90u8, 12u8, 202u8, 195u8, 25u8, 18u8, 100u8, @@ -8748,7 +9095,10 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey, + ::subxt::storage::address::StaticStorageKey, + ), types::key_owner::KeyOwner, ::subxt::storage::address::Yes, (), @@ -8757,10 +9107,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Session", "KeyOwner", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 217u8, 204u8, 21u8, 114u8, 247u8, 129u8, 32u8, 242u8, 93u8, 91u8, 253u8, 253u8, 248u8, 90u8, 12u8, 202u8, 195u8, 25u8, 18u8, 100u8, @@ -8795,7 +9145,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::report_equivocation`]."] + #[doc = "Report voter equivocation/misbehavior. This method will verify the"] + #[doc = "equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence"] + #[doc = "will be reported."] pub struct ReportEquivocation { pub equivocation_proof: ::std::boxed::Box, @@ -8824,7 +9177,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::report_equivocation_unsigned`]."] + #[doc = "Report voter equivocation/misbehavior. This method will verify the"] + #[doc = "equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence"] + #[doc = "will be reported."] + #[doc = ""] + #[doc = "This extrinsic must be called unsigned and it is expected that only"] + #[doc = "block authors will call it (validated in `ValidateUnsigned`), as such"] + #[doc = "if the block author is defined it will be defined as the equivocation"] + #[doc = "reporter."] pub struct ReportEquivocationUnsigned { pub equivocation_proof: ::std::boxed::Box, @@ -8853,7 +9214,18 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::note_stalled`]."] + #[doc = "Note that the current authority set of the GRANDPA finality gadget has stalled."] + #[doc = ""] + #[doc = "This will trigger a forced authority set change at the beginning of the next session, to"] + #[doc = "be enacted `delay` blocks after that. The `delay` should be high enough to safely assume"] + #[doc = "that the block signalling the forced change will not be re-orged e.g. 1000 blocks."] + #[doc = "The block production rate (which may be slowed down because of finality lagging) should"] + #[doc = "be taken into account when choosing the `delay`. The GRANDPA voters based on the new"] + #[doc = "authority will start voting on top of `best_finalized_block_number` for new finalized"] + #[doc = "blocks. `best_finalized_block_number` should be the highest of the latest finalized"] + #[doc = "block of all validators of the new authority set."] + #[doc = ""] + #[doc = "Only callable by root."] pub struct NoteStalled { pub delay: note_stalled::Delay, pub best_finalized_block_number: note_stalled::BestFinalizedBlockNumber, @@ -8870,7 +9242,10 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::report_equivocation`]."] + #[doc = "Report voter equivocation/misbehavior. This method will verify the"] + #[doc = "equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence"] + #[doc = "will be reported."] pub fn report_equivocation( &self, equivocation_proof: types::report_equivocation::EquivocationProof, @@ -8890,7 +9265,15 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::report_equivocation_unsigned`]."] + #[doc = "Report voter equivocation/misbehavior. This method will verify the"] + #[doc = "equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence"] + #[doc = "will be reported."] + #[doc = ""] + #[doc = "This extrinsic must be called unsigned and it is expected that only"] + #[doc = "block authors will call it (validated in `ValidateUnsigned`), as such"] + #[doc = "if the block author is defined it will be defined as the equivocation"] + #[doc = "reporter."] pub fn report_equivocation_unsigned( &self, equivocation_proof: types::report_equivocation_unsigned::EquivocationProof, @@ -8910,7 +9293,18 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::note_stalled`]."] + #[doc = "Note that the current authority set of the GRANDPA finality gadget has stalled."] + #[doc = ""] + #[doc = "This will trigger a forced authority set change at the beginning of the next session, to"] + #[doc = "be enacted `delay` blocks after that. The `delay` should be high enough to safely assume"] + #[doc = "that the block signalling the forced change will not be re-orged e.g. 1000 blocks."] + #[doc = "The block production rate (which may be slowed down because of finality lagging) should"] + #[doc = "be taken into account when choosing the `delay`. The GRANDPA voters based on the new"] + #[doc = "authority will start voting on top of `best_finalized_block_number` for new finalized"] + #[doc = "blocks. `best_finalized_block_number` should be the highest of the latest finalized"] + #[doc = "block of all validators of the new authority set."] + #[doc = ""] + #[doc = "Only callable by root."] pub fn note_stalled( &self, delay: types::note_stalled::Delay, @@ -9040,7 +9434,7 @@ pub mod api { pub fn state( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::state::State, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -9049,7 +9443,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Grandpa", "State", - vec![], + (), [ 73u8, 71u8, 112u8, 83u8, 238u8, 75u8, 44u8, 9u8, 180u8, 33u8, 30u8, 121u8, 98u8, 96u8, 61u8, 133u8, 16u8, 70u8, 30u8, 249u8, 34u8, 148u8, @@ -9061,7 +9455,7 @@ pub mod api { pub fn pending_change( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::pending_change::PendingChange, ::subxt::storage::address::Yes, (), @@ -9070,7 +9464,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Grandpa", "PendingChange", - vec![], + (), [ 150u8, 194u8, 185u8, 248u8, 239u8, 43u8, 141u8, 253u8, 61u8, 106u8, 74u8, 164u8, 209u8, 204u8, 206u8, 200u8, 32u8, 38u8, 11u8, 78u8, 84u8, @@ -9083,7 +9477,7 @@ pub mod api { pub fn next_forced( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::next_forced::NextForced, ::subxt::storage::address::Yes, (), @@ -9092,7 +9486,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Grandpa", "NextForced", - vec![], + (), [ 3u8, 231u8, 56u8, 18u8, 87u8, 112u8, 227u8, 126u8, 180u8, 131u8, 255u8, 141u8, 82u8, 34u8, 61u8, 47u8, 234u8, 37u8, 95u8, 62u8, 33u8, 235u8, @@ -9104,7 +9498,7 @@ pub mod api { pub fn stalled( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::stalled::Stalled, ::subxt::storage::address::Yes, (), @@ -9113,7 +9507,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Grandpa", "Stalled", - vec![], + (), [ 6u8, 81u8, 205u8, 142u8, 195u8, 48u8, 0u8, 247u8, 108u8, 170u8, 10u8, 249u8, 72u8, 206u8, 32u8, 103u8, 109u8, 57u8, 51u8, 21u8, 144u8, 204u8, @@ -9126,7 +9520,7 @@ pub mod api { pub fn current_set_id( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::current_set_id::CurrentSetId, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -9135,7 +9529,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Grandpa", "CurrentSetId", - vec![], + (), [ 234u8, 215u8, 218u8, 42u8, 30u8, 76u8, 129u8, 40u8, 125u8, 137u8, 207u8, 47u8, 46u8, 213u8, 159u8, 50u8, 175u8, 81u8, 155u8, 123u8, @@ -9157,7 +9551,7 @@ pub mod api { pub fn set_id_session_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::set_id_session::SetIdSession, (), (), @@ -9166,7 +9560,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Grandpa", "SetIdSession", - vec![], + (), [ 47u8, 0u8, 239u8, 121u8, 187u8, 213u8, 254u8, 50u8, 238u8, 10u8, 162u8, 65u8, 189u8, 166u8, 37u8, 74u8, 82u8, 81u8, 160u8, 20u8, 180u8, 253u8, @@ -9188,7 +9582,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::set_id_session::SetIdSession, ::subxt::storage::address::Yes, (), @@ -9197,9 +9591,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Grandpa", "SetIdSession", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 47u8, 0u8, 239u8, 121u8, 187u8, 213u8, 254u8, 50u8, 238u8, 10u8, 162u8, 65u8, 189u8, 166u8, 37u8, 74u8, 82u8, 81u8, 160u8, 20u8, 180u8, 253u8, @@ -9211,7 +9603,7 @@ pub mod api { pub fn authorities( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::authorities::Authorities, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -9220,7 +9612,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Grandpa", "Authorities", - vec![], + (), [ 67u8, 196u8, 244u8, 13u8, 246u8, 245u8, 198u8, 98u8, 81u8, 55u8, 182u8, 187u8, 214u8, 5u8, 181u8, 76u8, 251u8, 213u8, 144u8, 166u8, 36u8, @@ -9316,7 +9708,7 @@ pub mod api { pub fn keys( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::keys::Keys, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -9325,7 +9717,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "AuthorityDiscovery", "Keys", - vec![], + (), [ 111u8, 104u8, 188u8, 46u8, 152u8, 140u8, 137u8, 244u8, 52u8, 214u8, 115u8, 156u8, 39u8, 239u8, 15u8, 168u8, 193u8, 125u8, 57u8, 195u8, @@ -9338,7 +9730,7 @@ pub mod api { pub fn next_keys( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::next_keys::NextKeys, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -9347,7 +9739,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "AuthorityDiscovery", "NextKeys", - vec![], + (), [ 171u8, 107u8, 15u8, 108u8, 125u8, 102u8, 193u8, 240u8, 127u8, 160u8, 53u8, 1u8, 208u8, 36u8, 134u8, 4u8, 216u8, 26u8, 156u8, 143u8, 154u8, @@ -9381,7 +9773,22 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::propose_spend`]."] + #[doc = "Put forward a suggestion for spending."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be signed."] + #[doc = ""] + #[doc = "## Details"] + #[doc = "A deposit proportional to the value is reserved and slashed if the proposal is rejected."] + #[doc = "It is returned once the proposal is awarded."] + #[doc = ""] + #[doc = "### Complexity"] + #[doc = "- O(1)"] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::Proposed`] if successful."] pub struct ProposeSpend { #[codec(compact)] pub value: propose_spend::Value, @@ -9407,7 +9814,21 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::reject_proposal`]."] + #[doc = "Reject a proposed spend."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::RejectOrigin`]."] + #[doc = ""] + #[doc = "## Details"] + #[doc = "The original deposit will be slashed."] + #[doc = ""] + #[doc = "### Complexity"] + #[doc = "- O(1)"] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::Rejected`] if successful."] pub struct RejectProposal { #[codec(compact)] pub proposal_id: reject_proposal::ProposalId, @@ -9430,7 +9851,23 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::approve_proposal`]."] + #[doc = "Approve a proposal."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::ApproveOrigin`]."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "At a later time, the proposal will be allocated to the beneficiary and the original"] + #[doc = "deposit will be returned."] + #[doc = ""] + #[doc = "### Complexity"] + #[doc = " - O(1)."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "No events are emitted from this dispatch."] pub struct ApproveProposal { #[codec(compact)] pub proposal_id: approve_proposal::ProposalId, @@ -9453,7 +9890,23 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::spend_local`]."] + #[doc = "Propose and approve a spend of treasury funds."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::SpendOrigin`] with the `Success` value being at least `amount`."] + #[doc = ""] + #[doc = "### Details"] + #[doc = "NOTE: For record-keeping purposes, the proposer is deemed to be equivalent to the"] + #[doc = "beneficiary."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `amount`: The amount to be transferred from the treasury to the `beneficiary`."] + #[doc = "- `beneficiary`: The destination account for the transfer."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::SpendApproved`] if successful."] pub struct SpendLocal { #[codec(compact)] pub amount: spend_local::Amount, @@ -9479,7 +9932,27 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove_approval`]."] + #[doc = "Force a previously approved proposal to be removed from the approval queue."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::RejectOrigin`]."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "The original deposit will no longer be returned."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `proposal_id`: The index of a proposal"] + #[doc = ""] + #[doc = "### Complexity"] + #[doc = "- O(A) where `A` is the number of approvals"] + #[doc = ""] + #[doc = "### Errors"] + #[doc = "- [`Error::ProposalNotApproved`]: The `proposal_id` supplied was not found in the"] + #[doc = " approval queue, i.e., the proposal has not been approved. This could also mean the"] + #[doc = " proposal does not exist altogether, thus there is no way it would have been approved"] + #[doc = " in the first place."] pub struct RemoveApproval { #[codec(compact)] pub proposal_id: remove_approval::ProposalId, @@ -9502,7 +9975,32 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::spend`]."] + #[doc = "Propose and approve a spend of treasury funds."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::SpendOrigin`] with the `Success` value being at least"] + #[doc = "`amount` of `asset_kind` in the native asset. The amount of `asset_kind` is converted"] + #[doc = "for assertion using the [`Config::BalanceConverter`]."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "Create an approved spend for transferring a specific `amount` of `asset_kind` to a"] + #[doc = "designated beneficiary. The spend must be claimed using the `payout` dispatchable within"] + #[doc = "the [`Config::PayoutPeriod`]."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `asset_kind`: An indicator of the specific asset class to be spent."] + #[doc = "- `amount`: The amount to be transferred from the treasury to the `beneficiary`."] + #[doc = "- `beneficiary`: The beneficiary of the spend."] + #[doc = "- `valid_from`: The block number from which the spend can be claimed. It can refer to"] + #[doc = " the past if the resulting spend has not yet expired according to the"] + #[doc = " [`Config::PayoutPeriod`]. If `None`, the spend can be claimed immediately after"] + #[doc = " approval."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::AssetSpendApproved`] if successful."] pub struct Spend { pub asset_kind: ::std::boxed::Box, #[codec(compact)] @@ -9532,7 +10030,25 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::payout`]."] + #[doc = "Claim a spend."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be signed."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "Spends must be claimed within some temporal bounds. A spend may be claimed within one"] + #[doc = "[`Config::PayoutPeriod`] from the `valid_from` block."] + #[doc = "In case of a payout failure, the spend status must be updated with the `check_status`"] + #[doc = "dispatchable before retrying with the current function."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `index`: The spend index."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::Paid`] if successful."] pub struct Payout { pub index: payout::Index, } @@ -9554,7 +10070,25 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::check_status`]."] + #[doc = "Check the status of the spend and remove it from the storage if processed."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be signed."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "The status check is a prerequisite for retrying a failed payout."] + #[doc = "If a spend has either succeeded or expired, it is removed from the storage by this"] + #[doc = "function. In such instances, transaction fees are refunded."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `index`: The spend index."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::PaymentFailed`] if the spend payout has failed."] + #[doc = "Emits [`Event::SpendProcessed`] if the spend payout has succeed."] pub struct CheckStatus { pub index: check_status::Index, } @@ -9576,7 +10110,22 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::void_spend`]."] + #[doc = "Void previously approved spend."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::RejectOrigin`]."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "A spend void is only possible if the payout has not been attempted yet."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `index`: The spend index."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::AssetSpendVoided`] if successful."] pub struct VoidSpend { pub index: void_spend::Index, } @@ -9591,7 +10140,22 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::propose_spend`]."] + #[doc = "Put forward a suggestion for spending."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be signed."] + #[doc = ""] + #[doc = "## Details"] + #[doc = "A deposit proportional to the value is reserved and slashed if the proposal is rejected."] + #[doc = "It is returned once the proposal is awarded."] + #[doc = ""] + #[doc = "### Complexity"] + #[doc = "- O(1)"] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::Proposed`] if successful."] pub fn propose_spend( &self, value: types::propose_spend::Value, @@ -9608,7 +10172,21 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::reject_proposal`]."] + #[doc = "Reject a proposed spend."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::RejectOrigin`]."] + #[doc = ""] + #[doc = "## Details"] + #[doc = "The original deposit will be slashed."] + #[doc = ""] + #[doc = "### Complexity"] + #[doc = "- O(1)"] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::Rejected`] if successful."] pub fn reject_proposal( &self, proposal_id: types::reject_proposal::ProposalId, @@ -9624,7 +10202,23 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::approve_proposal`]."] + #[doc = "Approve a proposal."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::ApproveOrigin`]."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "At a later time, the proposal will be allocated to the beneficiary and the original"] + #[doc = "deposit will be returned."] + #[doc = ""] + #[doc = "### Complexity"] + #[doc = " - O(1)."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "No events are emitted from this dispatch."] pub fn approve_proposal( &self, proposal_id: types::approve_proposal::ProposalId, @@ -9640,7 +10234,23 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::spend_local`]."] + #[doc = "Propose and approve a spend of treasury funds."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::SpendOrigin`] with the `Success` value being at least `amount`."] + #[doc = ""] + #[doc = "### Details"] + #[doc = "NOTE: For record-keeping purposes, the proposer is deemed to be equivalent to the"] + #[doc = "beneficiary."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `amount`: The amount to be transferred from the treasury to the `beneficiary`."] + #[doc = "- `beneficiary`: The destination account for the transfer."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::SpendApproved`] if successful."] pub fn spend_local( &self, amount: types::spend_local::Amount, @@ -9660,7 +10270,27 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remove_approval`]."] + #[doc = "Force a previously approved proposal to be removed from the approval queue."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::RejectOrigin`]."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "The original deposit will no longer be returned."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `proposal_id`: The index of a proposal"] + #[doc = ""] + #[doc = "### Complexity"] + #[doc = "- O(A) where `A` is the number of approvals"] + #[doc = ""] + #[doc = "### Errors"] + #[doc = "- [`Error::ProposalNotApproved`]: The `proposal_id` supplied was not found in the"] + #[doc = " approval queue, i.e., the proposal has not been approved. This could also mean the"] + #[doc = " proposal does not exist altogether, thus there is no way it would have been approved"] + #[doc = " in the first place."] pub fn remove_approval( &self, proposal_id: types::remove_approval::ProposalId, @@ -9677,7 +10307,32 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::spend`]."] + #[doc = "Propose and approve a spend of treasury funds."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::SpendOrigin`] with the `Success` value being at least"] + #[doc = "`amount` of `asset_kind` in the native asset. The amount of `asset_kind` is converted"] + #[doc = "for assertion using the [`Config::BalanceConverter`]."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "Create an approved spend for transferring a specific `amount` of `asset_kind` to a"] + #[doc = "designated beneficiary. The spend must be claimed using the `payout` dispatchable within"] + #[doc = "the [`Config::PayoutPeriod`]."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `asset_kind`: An indicator of the specific asset class to be spent."] + #[doc = "- `amount`: The amount to be transferred from the treasury to the `beneficiary`."] + #[doc = "- `beneficiary`: The beneficiary of the spend."] + #[doc = "- `valid_from`: The block number from which the spend can be claimed. It can refer to"] + #[doc = " the past if the resulting spend has not yet expired according to the"] + #[doc = " [`Config::PayoutPeriod`]. If `None`, the spend can be claimed immediately after"] + #[doc = " approval."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::AssetSpendApproved`] if successful."] pub fn spend( &self, asset_kind: types::spend::AssetKind, @@ -9702,7 +10357,25 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::payout`]."] + #[doc = "Claim a spend."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be signed."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "Spends must be claimed within some temporal bounds. A spend may be claimed within one"] + #[doc = "[`Config::PayoutPeriod`] from the `valid_from` block."] + #[doc = "In case of a payout failure, the spend status must be updated with the `check_status`"] + #[doc = "dispatchable before retrying with the current function."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `index`: The spend index."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::Paid`] if successful."] pub fn payout( &self, index: types::payout::Index, @@ -9718,7 +10391,25 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::check_status`]."] + #[doc = "Check the status of the spend and remove it from the storage if processed."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be signed."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "The status check is a prerequisite for retrying a failed payout."] + #[doc = "If a spend has either succeeded or expired, it is removed from the storage by this"] + #[doc = "function. In such instances, transaction fees are refunded."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `index`: The spend index."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::PaymentFailed`] if the spend payout has failed."] + #[doc = "Emits [`Event::SpendProcessed`] if the spend payout has succeed."] pub fn check_status( &self, index: types::check_status::Index, @@ -9734,7 +10425,22 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::void_spend`]."] + #[doc = "Void previously approved spend."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::RejectOrigin`]."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "A spend void is only possible if the payout has not been attempted yet."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `index`: The spend index."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::AssetSpendVoided`] if successful."] pub fn void_spend( &self, index: types::void_spend::Index, @@ -10142,7 +10848,7 @@ pub mod api { pub fn proposal_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::proposal_count::ProposalCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -10151,7 +10857,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Treasury", "ProposalCount", - vec![], + (), [ 91u8, 238u8, 246u8, 106u8, 95u8, 66u8, 83u8, 134u8, 1u8, 225u8, 164u8, 216u8, 113u8, 101u8, 203u8, 200u8, 113u8, 97u8, 246u8, 228u8, 140u8, @@ -10163,7 +10869,7 @@ pub mod api { pub fn proposals_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::proposals::Proposals, (), (), @@ -10172,7 +10878,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Treasury", "Proposals", - vec![], + (), [ 207u8, 135u8, 145u8, 146u8, 48u8, 10u8, 252u8, 40u8, 20u8, 115u8, 205u8, 41u8, 173u8, 83u8, 115u8, 46u8, 106u8, 40u8, 130u8, 157u8, @@ -10186,7 +10892,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::proposals::Proposals, ::subxt::storage::address::Yes, (), @@ -10195,9 +10901,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Treasury", "Proposals", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 207u8, 135u8, 145u8, 146u8, 48u8, 10u8, 252u8, 40u8, 20u8, 115u8, 205u8, 41u8, 173u8, 83u8, 115u8, 46u8, 106u8, 40u8, 130u8, 157u8, @@ -10210,7 +10914,7 @@ pub mod api { pub fn deactivated( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::deactivated::Deactivated, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -10219,7 +10923,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Treasury", "Deactivated", - vec![], + (), [ 120u8, 221u8, 159u8, 56u8, 161u8, 44u8, 54u8, 233u8, 47u8, 114u8, 170u8, 150u8, 52u8, 24u8, 137u8, 212u8, 122u8, 247u8, 40u8, 17u8, @@ -10232,7 +10936,7 @@ pub mod api { pub fn approvals( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::approvals::Approvals, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -10241,7 +10945,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Treasury", "Approvals", - vec![], + (), [ 78u8, 147u8, 186u8, 235u8, 17u8, 40u8, 247u8, 235u8, 67u8, 222u8, 3u8, 14u8, 248u8, 17u8, 67u8, 180u8, 93u8, 161u8, 64u8, 35u8, 119u8, 194u8, @@ -10253,7 +10957,7 @@ pub mod api { pub fn spend_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::spend_count::SpendCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -10262,7 +10966,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Treasury", "SpendCount", - vec![], + (), [ 220u8, 74u8, 248u8, 52u8, 243u8, 209u8, 42u8, 236u8, 27u8, 98u8, 76u8, 153u8, 129u8, 176u8, 34u8, 177u8, 33u8, 132u8, 21u8, 71u8, 206u8, @@ -10275,7 +10979,7 @@ pub mod api { pub fn spends_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::spends::Spends, (), (), @@ -10284,7 +10988,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Treasury", "Spends", - vec![], + (), [ 207u8, 104u8, 63u8, 103u8, 177u8, 66u8, 236u8, 100u8, 122u8, 213u8, 125u8, 153u8, 180u8, 219u8, 124u8, 22u8, 88u8, 161u8, 188u8, 197u8, @@ -10298,7 +11002,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::spends::Spends, ::subxt::storage::address::Yes, (), @@ -10307,9 +11011,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Treasury", "Spends", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 207u8, 104u8, 63u8, 103u8, 177u8, 66u8, 236u8, 100u8, 122u8, 213u8, 125u8, 153u8, 180u8, 219u8, 124u8, 22u8, 88u8, 161u8, 188u8, 197u8, @@ -10467,7 +11169,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::vote`]."] + #[doc = "Vote in a poll. If `vote.is_aye()`, the vote is to enact the proposal;"] + #[doc = "otherwise it is a vote to keep the status quo."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_."] + #[doc = ""] + #[doc = "- `poll_index`: The index of the poll to vote for."] + #[doc = "- `vote`: The vote configuration."] + #[doc = ""] + #[doc = "Weight: `O(R)` where R is the number of polls the voter has voted on."] pub struct Vote { #[codec(compact)] pub poll_index: vote::PollIndex, @@ -10494,7 +11204,29 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::delegate`]."] + #[doc = "Delegate the voting power (with some given conviction) of the sending account for a"] + #[doc = "particular class of polls."] + #[doc = ""] + #[doc = "The balance delegated is locked for as long as it's delegated, and thereafter for the"] + #[doc = "time appropriate for the conviction's lock period."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_, and the signing account must either:"] + #[doc = " - be delegating already; or"] + #[doc = " - have no voting activity (if there is, then it will need to be removed through"] + #[doc = " `remove_vote`)."] + #[doc = ""] + #[doc = "- `to`: The account whose voting the `target` account's voting power will follow."] + #[doc = "- `class`: The class of polls to delegate. To delegate multiple classes, multiple calls"] + #[doc = " to this function are required."] + #[doc = "- `conviction`: The conviction that will be attached to the delegated votes. When the"] + #[doc = " account is undelegated, the funds will be locked for the corresponding period."] + #[doc = "- `balance`: The amount of the account's balance to be used in delegating. This must not"] + #[doc = " be more than the account's current balance."] + #[doc = ""] + #[doc = "Emits `Delegated`."] + #[doc = ""] + #[doc = "Weight: `O(R)` where R is the number of polls the voter delegating to has"] + #[doc = " voted on. Weight is initially charged as if maximum votes, but is refunded later."] pub struct Delegate { pub class: delegate::Class, pub to: delegate::To, @@ -10523,7 +11255,20 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::undelegate`]."] + #[doc = "Undelegate the voting power of the sending account for a particular class of polls."] + #[doc = ""] + #[doc = "Tokens may be unlocked following once an amount of time consistent with the lock period"] + #[doc = "of the conviction with which the delegation was issued has passed."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_ and the signing account must be"] + #[doc = "currently delegating."] + #[doc = ""] + #[doc = "- `class`: The class of polls to remove the delegation from."] + #[doc = ""] + #[doc = "Emits `Undelegated`."] + #[doc = ""] + #[doc = "Weight: `O(R)` where R is the number of polls the voter delegating to has"] + #[doc = " voted on. Weight is initially charged as if maximum votes, but is refunded later."] pub struct Undelegate { pub class: undelegate::Class, } @@ -10545,7 +11290,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::unlock`]."] + #[doc = "Remove the lock caused by prior voting/delegating which has expired within a particular"] + #[doc = "class."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_."] + #[doc = ""] + #[doc = "- `class`: The class of polls to unlock."] + #[doc = "- `target`: The account to remove the lock on."] + #[doc = ""] + #[doc = "Weight: `O(R)` with R number of vote of target."] pub struct Unlock { pub class: unlock::Class, pub target: unlock::Target, @@ -10569,7 +11322,35 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove_vote`]."] + #[doc = "Remove a vote for a poll."] + #[doc = ""] + #[doc = "If:"] + #[doc = "- the poll was cancelled, or"] + #[doc = "- the poll is ongoing, or"] + #[doc = "- the poll has ended such that"] + #[doc = " - the vote of the account was in opposition to the result; or"] + #[doc = " - there was no conviction to the account's vote; or"] + #[doc = " - the account made a split vote"] + #[doc = "...then the vote is removed cleanly and a following call to `unlock` may result in more"] + #[doc = "funds being available."] + #[doc = ""] + #[doc = "If, however, the poll has ended and:"] + #[doc = "- it finished corresponding to the vote of the account, and"] + #[doc = "- the account made a standard vote with conviction, and"] + #[doc = "- the lock period of the conviction is not over"] + #[doc = "...then the lock will be aggregated into the overall account's lock, which may involve"] + #[doc = "*overlocking* (where the two locks are combined into a single lock that is the maximum"] + #[doc = "of both the amount locked and the time is it locked for)."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_, and the signer must have a vote"] + #[doc = "registered for poll `index`."] + #[doc = ""] + #[doc = "- `index`: The index of poll of the vote to be removed."] + #[doc = "- `class`: Optional parameter, if given it indicates the class of the poll. For polls"] + #[doc = " which have finished or are cancelled, this must be `Some`."] + #[doc = ""] + #[doc = "Weight: `O(R + log R)` where R is the number of polls that `target` has voted on."] + #[doc = " Weight is calculated for the maximum number of vote."] pub struct RemoveVote { pub class: remove_vote::Class, pub index: remove_vote::Index, @@ -10593,7 +11374,22 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove_other_vote`]."] + #[doc = "Remove a vote for a poll."] + #[doc = ""] + #[doc = "If the `target` is equal to the signer, then this function is exactly equivalent to"] + #[doc = "`remove_vote`. If not equal to the signer, then the vote must have expired,"] + #[doc = "either because the poll was cancelled, because the voter lost the poll or"] + #[doc = "because the conviction period is over."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_."] + #[doc = ""] + #[doc = "- `target`: The account of the vote to be removed; this account must have voted for poll"] + #[doc = " `index`."] + #[doc = "- `index`: The index of poll of the vote to be removed."] + #[doc = "- `class`: The class of the poll."] + #[doc = ""] + #[doc = "Weight: `O(R + log R)` where R is the number of polls that `target` has voted on."] + #[doc = " Weight is calculated for the maximum number of vote."] pub struct RemoveOtherVote { pub target: remove_other_vote::Target, pub class: remove_other_vote::Class, @@ -10612,7 +11408,15 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::vote`]."] + #[doc = "Vote in a poll. If `vote.is_aye()`, the vote is to enact the proposal;"] + #[doc = "otherwise it is a vote to keep the status quo."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_."] + #[doc = ""] + #[doc = "- `poll_index`: The index of the poll to vote for."] + #[doc = "- `vote`: The vote configuration."] + #[doc = ""] + #[doc = "Weight: `O(R)` where R is the number of polls the voter has voted on."] pub fn vote( &self, poll_index: types::vote::PollIndex, @@ -10630,7 +11434,29 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::delegate`]."] + #[doc = "Delegate the voting power (with some given conviction) of the sending account for a"] + #[doc = "particular class of polls."] + #[doc = ""] + #[doc = "The balance delegated is locked for as long as it's delegated, and thereafter for the"] + #[doc = "time appropriate for the conviction's lock period."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_, and the signing account must either:"] + #[doc = " - be delegating already; or"] + #[doc = " - have no voting activity (if there is, then it will need to be removed through"] + #[doc = " `remove_vote`)."] + #[doc = ""] + #[doc = "- `to`: The account whose voting the `target` account's voting power will follow."] + #[doc = "- `class`: The class of polls to delegate. To delegate multiple classes, multiple calls"] + #[doc = " to this function are required."] + #[doc = "- `conviction`: The conviction that will be attached to the delegated votes. When the"] + #[doc = " account is undelegated, the funds will be locked for the corresponding period."] + #[doc = "- `balance`: The amount of the account's balance to be used in delegating. This must not"] + #[doc = " be more than the account's current balance."] + #[doc = ""] + #[doc = "Emits `Delegated`."] + #[doc = ""] + #[doc = "Weight: `O(R)` where R is the number of polls the voter delegating to has"] + #[doc = " voted on. Weight is initially charged as if maximum votes, but is refunded later."] pub fn delegate( &self, class: types::delegate::Class, @@ -10654,7 +11480,20 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::undelegate`]."] + #[doc = "Undelegate the voting power of the sending account for a particular class of polls."] + #[doc = ""] + #[doc = "Tokens may be unlocked following once an amount of time consistent with the lock period"] + #[doc = "of the conviction with which the delegation was issued has passed."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_ and the signing account must be"] + #[doc = "currently delegating."] + #[doc = ""] + #[doc = "- `class`: The class of polls to remove the delegation from."] + #[doc = ""] + #[doc = "Emits `Undelegated`."] + #[doc = ""] + #[doc = "Weight: `O(R)` where R is the number of polls the voter delegating to has"] + #[doc = " voted on. Weight is initially charged as if maximum votes, but is refunded later."] pub fn undelegate( &self, class: types::undelegate::Class, @@ -10671,7 +11510,15 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::unlock`]."] + #[doc = "Remove the lock caused by prior voting/delegating which has expired within a particular"] + #[doc = "class."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_."] + #[doc = ""] + #[doc = "- `class`: The class of polls to unlock."] + #[doc = "- `target`: The account to remove the lock on."] + #[doc = ""] + #[doc = "Weight: `O(R)` with R number of vote of target."] pub fn unlock( &self, class: types::unlock::Class, @@ -10689,7 +11536,35 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remove_vote`]."] + #[doc = "Remove a vote for a poll."] + #[doc = ""] + #[doc = "If:"] + #[doc = "- the poll was cancelled, or"] + #[doc = "- the poll is ongoing, or"] + #[doc = "- the poll has ended such that"] + #[doc = " - the vote of the account was in opposition to the result; or"] + #[doc = " - there was no conviction to the account's vote; or"] + #[doc = " - the account made a split vote"] + #[doc = "...then the vote is removed cleanly and a following call to `unlock` may result in more"] + #[doc = "funds being available."] + #[doc = ""] + #[doc = "If, however, the poll has ended and:"] + #[doc = "- it finished corresponding to the vote of the account, and"] + #[doc = "- the account made a standard vote with conviction, and"] + #[doc = "- the lock period of the conviction is not over"] + #[doc = "...then the lock will be aggregated into the overall account's lock, which may involve"] + #[doc = "*overlocking* (where the two locks are combined into a single lock that is the maximum"] + #[doc = "of both the amount locked and the time is it locked for)."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_, and the signer must have a vote"] + #[doc = "registered for poll `index`."] + #[doc = ""] + #[doc = "- `index`: The index of poll of the vote to be removed."] + #[doc = "- `class`: Optional parameter, if given it indicates the class of the poll. For polls"] + #[doc = " which have finished or are cancelled, this must be `Some`."] + #[doc = ""] + #[doc = "Weight: `O(R + log R)` where R is the number of polls that `target` has voted on."] + #[doc = " Weight is calculated for the maximum number of vote."] pub fn remove_vote( &self, class: types::remove_vote::Class, @@ -10707,7 +11582,22 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remove_other_vote`]."] + #[doc = "Remove a vote for a poll."] + #[doc = ""] + #[doc = "If the `target` is equal to the signer, then this function is exactly equivalent to"] + #[doc = "`remove_vote`. If not equal to the signer, then the vote must have expired,"] + #[doc = "either because the poll was cancelled, because the voter lost the poll or"] + #[doc = "because the conviction period is over."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_."] + #[doc = ""] + #[doc = "- `target`: The account of the vote to be removed; this account must have voted for poll"] + #[doc = " `index`."] + #[doc = "- `index`: The index of poll of the vote to be removed."] + #[doc = "- `class`: The class of the poll."] + #[doc = ""] + #[doc = "Weight: `O(R + log R)` where R is the number of polls that `target` has voted on."] + #[doc = " Weight is calculated for the maximum number of vote."] pub fn remove_other_vote( &self, target: types::remove_other_vote::Target, @@ -10809,7 +11699,7 @@ pub mod api { pub fn voting_for_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::voting_for::VotingFor, (), ::subxt::storage::address::Yes, @@ -10818,7 +11708,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ConvictionVoting", "VotingFor", - vec![], + (), [ 76u8, 63u8, 153u8, 193u8, 39u8, 137u8, 186u8, 29u8, 202u8, 56u8, 169u8, 56u8, 103u8, 138u8, 192u8, 18u8, 179u8, 114u8, 56u8, 121u8, 197u8, @@ -10832,7 +11722,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::voting_for::VotingFor, (), ::subxt::storage::address::Yes, @@ -10841,9 +11731,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ConvictionVoting", "VotingFor", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 76u8, 63u8, 153u8, 193u8, 39u8, 137u8, 186u8, 29u8, 202u8, 56u8, 169u8, 56u8, 103u8, 138u8, 192u8, 18u8, 179u8, 114u8, 56u8, 121u8, 197u8, @@ -10858,7 +11746,10 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey, + ::subxt::storage::address::StaticStorageKey, + ), types::voting_for::VotingFor, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -10867,10 +11758,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ConvictionVoting", "VotingFor", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 76u8, 63u8, 153u8, 193u8, 39u8, 137u8, 186u8, 29u8, 202u8, 56u8, 169u8, 56u8, 103u8, 138u8, 192u8, 18u8, 179u8, 114u8, 56u8, 121u8, 197u8, @@ -10884,7 +11775,7 @@ pub mod api { pub fn class_locks_for_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::class_locks_for::ClassLocksFor, (), ::subxt::storage::address::Yes, @@ -10893,7 +11784,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ConvictionVoting", "ClassLocksFor", - vec![], + (), [ 74u8, 74u8, 8u8, 82u8, 215u8, 61u8, 13u8, 9u8, 44u8, 222u8, 33u8, 245u8, 195u8, 124u8, 6u8, 174u8, 65u8, 245u8, 71u8, 42u8, 47u8, 46u8, @@ -10908,7 +11799,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::class_locks_for::ClassLocksFor, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -10917,9 +11808,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ConvictionVoting", "ClassLocksFor", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 74u8, 74u8, 8u8, 82u8, 215u8, 61u8, 13u8, 9u8, 44u8, 222u8, 33u8, 245u8, 195u8, 124u8, 6u8, 174u8, 65u8, 245u8, 71u8, 42u8, 47u8, 46u8, @@ -10993,7 +11882,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::submit`]."] + #[doc = "Propose a referendum on a privileged action."] + #[doc = ""] + #[doc = "- `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds"] + #[doc = " available."] + #[doc = "- `proposal_origin`: The origin from which the proposal should be executed."] + #[doc = "- `proposal`: The proposal."] + #[doc = "- `enactment_moment`: The moment that the proposal should be enacted."] + #[doc = ""] + #[doc = "Emits `Submitted`."] pub struct Submit { pub proposal_origin: ::std::boxed::Box, pub proposal: submit::Proposal, @@ -11025,7 +11922,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::place_decision_deposit`]."] + #[doc = "Post the Decision Deposit for a referendum."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` and the account must have funds available for the"] + #[doc = " referendum's track's Decision Deposit."] + #[doc = "- `index`: The index of the submitted referendum whose Decision Deposit is yet to be"] + #[doc = " posted."] + #[doc = ""] + #[doc = "Emits `DecisionDepositPlaced`."] pub struct PlaceDecisionDeposit { pub index: place_decision_deposit::Index, } @@ -11047,7 +11951,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::refund_decision_deposit`]."] + #[doc = "Refund the Decision Deposit for a closed referendum back to the depositor."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` or `Root`."] + #[doc = "- `index`: The index of a closed referendum whose Decision Deposit has not yet been"] + #[doc = " refunded."] + #[doc = ""] + #[doc = "Emits `DecisionDepositRefunded`."] pub struct RefundDecisionDeposit { pub index: refund_decision_deposit::Index, } @@ -11069,7 +11979,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::cancel`]."] + #[doc = "Cancel an ongoing referendum."] + #[doc = ""] + #[doc = "- `origin`: must be the `CancelOrigin`."] + #[doc = "- `index`: The index of the referendum to be cancelled."] + #[doc = ""] + #[doc = "Emits `Cancelled`."] pub struct Cancel { pub index: cancel::Index, } @@ -11091,7 +12006,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::kill`]."] + #[doc = "Cancel an ongoing referendum and slash the deposits."] + #[doc = ""] + #[doc = "- `origin`: must be the `KillOrigin`."] + #[doc = "- `index`: The index of the referendum to be cancelled."] + #[doc = ""] + #[doc = "Emits `Killed` and `DepositSlashed`."] pub struct Kill { pub index: kill::Index, } @@ -11113,7 +12033,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::nudge_referendum`]."] + #[doc = "Advance a referendum onto its next logical state. Only used internally."] + #[doc = ""] + #[doc = "- `origin`: must be `Root`."] + #[doc = "- `index`: the referendum to be advanced."] pub struct NudgeReferendum { pub index: nudge_referendum::Index, } @@ -11135,7 +12058,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::one_fewer_deciding`]."] + #[doc = "Advance a track onto its next logical state. Only used internally."] + #[doc = ""] + #[doc = "- `origin`: must be `Root`."] + #[doc = "- `track`: the track to be advanced."] + #[doc = ""] + #[doc = "Action item for when there is now one fewer referendum in the deciding phase and the"] + #[doc = "`DecidingCount` is not yet updated. This means that we should either:"] + #[doc = "- begin deciding another referendum (and leave `DecidingCount` alone); or"] + #[doc = "- decrement `DecidingCount`."] pub struct OneFewerDeciding { pub track: one_fewer_deciding::Track, } @@ -11157,7 +12088,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::refund_submission_deposit`]."] + #[doc = "Refund the Submission Deposit for a closed referendum back to the depositor."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` or `Root`."] + #[doc = "- `index`: The index of a closed referendum whose Submission Deposit has not yet been"] + #[doc = " refunded."] + #[doc = ""] + #[doc = "Emits `SubmissionDepositRefunded`."] pub struct RefundSubmissionDeposit { pub index: refund_submission_deposit::Index, } @@ -11179,7 +12116,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_metadata`]."] + #[doc = "Set or clear metadata of a referendum."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a"] + #[doc = " metadata of a finished referendum."] + #[doc = "- `index`: The index of a referendum to set or clear metadata for."] + #[doc = "- `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata."] pub struct SetMetadata { pub index: set_metadata::Index, pub maybe_hash: set_metadata::MaybeHash, @@ -11196,7 +12139,15 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::submit`]."] + #[doc = "Propose a referendum on a privileged action."] + #[doc = ""] + #[doc = "- `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds"] + #[doc = " available."] + #[doc = "- `proposal_origin`: The origin from which the proposal should be executed."] + #[doc = "- `proposal`: The proposal."] + #[doc = "- `enactment_moment`: The moment that the proposal should be enacted."] + #[doc = ""] + #[doc = "Emits `Submitted`."] pub fn submit( &self, proposal_origin: types::submit::ProposalOrigin, @@ -11218,7 +12169,14 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::place_decision_deposit`]."] + #[doc = "Post the Decision Deposit for a referendum."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` and the account must have funds available for the"] + #[doc = " referendum's track's Decision Deposit."] + #[doc = "- `index`: The index of the submitted referendum whose Decision Deposit is yet to be"] + #[doc = " posted."] + #[doc = ""] + #[doc = "Emits `DecisionDepositPlaced`."] pub fn place_decision_deposit( &self, index: types::place_decision_deposit::Index, @@ -11234,7 +12192,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::refund_decision_deposit`]."] + #[doc = "Refund the Decision Deposit for a closed referendum back to the depositor."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` or `Root`."] + #[doc = "- `index`: The index of a closed referendum whose Decision Deposit has not yet been"] + #[doc = " refunded."] + #[doc = ""] + #[doc = "Emits `DecisionDepositRefunded`."] pub fn refund_decision_deposit( &self, index: types::refund_decision_deposit::Index, @@ -11250,7 +12214,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::cancel`]."] + #[doc = "Cancel an ongoing referendum."] + #[doc = ""] + #[doc = "- `origin`: must be the `CancelOrigin`."] + #[doc = "- `index`: The index of the referendum to be cancelled."] + #[doc = ""] + #[doc = "Emits `Cancelled`."] pub fn cancel( &self, index: types::cancel::Index, @@ -11267,7 +12236,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::kill`]."] + #[doc = "Cancel an ongoing referendum and slash the deposits."] + #[doc = ""] + #[doc = "- `origin`: must be the `KillOrigin`."] + #[doc = "- `index`: The index of the referendum to be cancelled."] + #[doc = ""] + #[doc = "Emits `Killed` and `DepositSlashed`."] pub fn kill(&self, index: types::kill::Index) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Referenda", @@ -11281,7 +12255,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::nudge_referendum`]."] + #[doc = "Advance a referendum onto its next logical state. Only used internally."] + #[doc = ""] + #[doc = "- `origin`: must be `Root`."] + #[doc = "- `index`: the referendum to be advanced."] pub fn nudge_referendum( &self, index: types::nudge_referendum::Index, @@ -11298,7 +12275,15 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::one_fewer_deciding`]."] + #[doc = "Advance a track onto its next logical state. Only used internally."] + #[doc = ""] + #[doc = "- `origin`: must be `Root`."] + #[doc = "- `track`: the track to be advanced."] + #[doc = ""] + #[doc = "Action item for when there is now one fewer referendum in the deciding phase and the"] + #[doc = "`DecidingCount` is not yet updated. This means that we should either:"] + #[doc = "- begin deciding another referendum (and leave `DecidingCount` alone); or"] + #[doc = "- decrement `DecidingCount`."] pub fn one_fewer_deciding( &self, track: types::one_fewer_deciding::Track, @@ -11315,7 +12300,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::refund_submission_deposit`]."] + #[doc = "Refund the Submission Deposit for a closed referendum back to the depositor."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` or `Root`."] + #[doc = "- `index`: The index of a closed referendum whose Submission Deposit has not yet been"] + #[doc = " refunded."] + #[doc = ""] + #[doc = "Emits `SubmissionDepositRefunded`."] pub fn refund_submission_deposit( &self, index: types::refund_submission_deposit::Index, @@ -11331,7 +12322,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_metadata`]."] + #[doc = "Set or clear metadata of a referendum."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a"] + #[doc = " metadata of a finished referendum."] + #[doc = "- `index`: The index of a referendum to set or clear metadata for."] + #[doc = "- `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata."] pub fn set_metadata( &self, index: types::set_metadata::Index, @@ -11810,7 +12807,7 @@ pub mod api { pub fn referendum_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::referendum_count::ReferendumCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -11819,7 +12816,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Referenda", "ReferendumCount", - vec![], + (), [ 64u8, 145u8, 232u8, 153u8, 121u8, 87u8, 128u8, 253u8, 170u8, 192u8, 139u8, 18u8, 0u8, 33u8, 243u8, 11u8, 238u8, 222u8, 244u8, 5u8, 247u8, @@ -11832,7 +12829,7 @@ pub mod api { pub fn referendum_info_for_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::referendum_info_for::ReferendumInfoFor, (), (), @@ -11841,7 +12838,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Referenda", "ReferendumInfoFor", - vec![], + (), [ 244u8, 215u8, 156u8, 181u8, 105u8, 12u8, 138u8, 249u8, 173u8, 158u8, 171u8, 67u8, 107u8, 228u8, 45u8, 180u8, 252u8, 244u8, 186u8, 78u8, @@ -11855,7 +12852,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::referendum_info_for::ReferendumInfoFor, ::subxt::storage::address::Yes, (), @@ -11864,9 +12861,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Referenda", "ReferendumInfoFor", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 244u8, 215u8, 156u8, 181u8, 105u8, 12u8, 138u8, 249u8, 173u8, 158u8, 171u8, 67u8, 107u8, 228u8, 45u8, 180u8, 252u8, 244u8, 186u8, 78u8, @@ -11882,7 +12877,7 @@ pub mod api { pub fn track_queue_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::track_queue::TrackQueue, (), ::subxt::storage::address::Yes, @@ -11891,7 +12886,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Referenda", "TrackQueue", - vec![], + (), [ 125u8, 59u8, 111u8, 68u8, 27u8, 236u8, 82u8, 55u8, 83u8, 159u8, 105u8, 20u8, 241u8, 118u8, 58u8, 141u8, 103u8, 60u8, 246u8, 49u8, 121u8, @@ -11907,7 +12902,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::track_queue::TrackQueue, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -11916,9 +12911,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Referenda", "TrackQueue", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 125u8, 59u8, 111u8, 68u8, 27u8, 236u8, 82u8, 55u8, 83u8, 159u8, 105u8, 20u8, 241u8, 118u8, 58u8, 141u8, 103u8, 60u8, 246u8, 49u8, 121u8, @@ -11930,7 +12923,7 @@ pub mod api { pub fn deciding_count_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::deciding_count::DecidingCount, (), ::subxt::storage::address::Yes, @@ -11939,7 +12932,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Referenda", "DecidingCount", - vec![], + (), [ 203u8, 89u8, 158u8, 179u8, 194u8, 82u8, 248u8, 162u8, 93u8, 140u8, 146u8, 51u8, 110u8, 232u8, 51u8, 1u8, 128u8, 212u8, 199u8, 14u8, 182u8, @@ -11953,7 +12946,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::deciding_count::DecidingCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -11962,9 +12955,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Referenda", "DecidingCount", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 203u8, 89u8, 158u8, 179u8, 194u8, 82u8, 248u8, 162u8, 93u8, 140u8, 146u8, 51u8, 110u8, 232u8, 51u8, 1u8, 128u8, 212u8, 199u8, 14u8, 182u8, @@ -11982,7 +12973,7 @@ pub mod api { pub fn metadata_of_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::metadata_of::MetadataOf, (), (), @@ -11991,7 +12982,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Referenda", "MetadataOf", - vec![], + (), [ 159u8, 250u8, 56u8, 189u8, 247u8, 165u8, 206u8, 166u8, 91u8, 139u8, 124u8, 164u8, 25u8, 246u8, 199u8, 36u8, 159u8, 56u8, 227u8, 136u8, 4u8, @@ -12010,7 +13001,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::metadata_of::MetadataOf, ::subxt::storage::address::Yes, (), @@ -12019,9 +13010,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Referenda", "MetadataOf", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 159u8, 250u8, 56u8, 189u8, 247u8, 165u8, 206u8, 166u8, 91u8, 139u8, 124u8, 164u8, 25u8, 246u8, 199u8, 36u8, 159u8, 56u8, 227u8, 136u8, 4u8, @@ -12145,7 +13134,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::add_member`]."] + #[doc = "Introduce a new member."] + #[doc = ""] + #[doc = "- `origin`: Must be the `AddOrigin`."] + #[doc = "- `who`: Account of non-member which will become a member."] + #[doc = ""] + #[doc = "Weight: `O(1)`"] pub struct AddMember { pub who: add_member::Who, } @@ -12167,7 +13161,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::promote_member`]."] + #[doc = "Increment the rank of an existing member by one."] + #[doc = ""] + #[doc = "- `origin`: Must be the `PromoteOrigin`."] + #[doc = "- `who`: Account of existing member."] + #[doc = ""] + #[doc = "Weight: `O(1)`"] pub struct PromoteMember { pub who: promote_member::Who, } @@ -12189,7 +13188,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::demote_member`]."] + #[doc = "Decrement the rank of an existing member by one. If the member is already at rank zero,"] + #[doc = "then they are removed entirely."] + #[doc = ""] + #[doc = "- `origin`: Must be the `DemoteOrigin`."] + #[doc = "- `who`: Account of existing member of rank greater than zero."] + #[doc = ""] + #[doc = "Weight: `O(1)`, less if the member's index is highest in its rank."] pub struct DemoteMember { pub who: demote_member::Who, } @@ -12211,7 +13216,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove_member`]."] + #[doc = "Remove the member entirely."] + #[doc = ""] + #[doc = "- `origin`: Must be the `RemoveOrigin`."] + #[doc = "- `who`: Account of existing member of rank greater than zero."] + #[doc = "- `min_rank`: The rank of the member or greater."] + #[doc = ""] + #[doc = "Weight: `O(min_rank)`."] pub struct RemoveMember { pub who: remove_member::Who, pub min_rank: remove_member::MinRank, @@ -12235,7 +13246,17 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::vote`]."] + #[doc = "Add an aye or nay vote for the sender to the given proposal."] + #[doc = ""] + #[doc = "- `origin`: Must be `Signed` by a member account."] + #[doc = "- `poll`: Index of a poll which is ongoing."] + #[doc = "- `aye`: `true` if the vote is to approve the proposal, `false` otherwise."] + #[doc = ""] + #[doc = "Transaction fees are be waived if the member is voting on any particular proposal"] + #[doc = "for the first time and the call is successful. Subsequent vote changes will charge a"] + #[doc = "fee."] + #[doc = ""] + #[doc = "Weight: `O(1)`, less if there was no previous vote on the poll by the member."] pub struct Vote { pub poll: vote::Poll, pub aye: vote::Aye, @@ -12259,7 +13280,16 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::cleanup_poll`]."] + #[doc = "Remove votes from the given poll. It must have ended."] + #[doc = ""] + #[doc = "- `origin`: Must be `Signed` by any account."] + #[doc = "- `poll_index`: Index of a poll which is completed and for which votes continue to"] + #[doc = " exist."] + #[doc = "- `max`: Maximum number of vote items from remove in this call."] + #[doc = ""] + #[doc = "Transaction fees are waived if the operation is successful."] + #[doc = ""] + #[doc = "Weight `O(max)` (less if there are fewer items to remove than `max`)."] pub struct CleanupPoll { pub poll_index: cleanup_poll::PollIndex, pub max: cleanup_poll::Max, @@ -12283,7 +13313,11 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::exchange_member`]."] + #[doc = "Exchanges a member with a new account and the same existing rank."] + #[doc = ""] + #[doc = "- `origin`: Must be the `ExchangeOrigin`."] + #[doc = "- `who`: Account of existing member of rank greater than zero to be exchanged."] + #[doc = "- `new_who`: New Account of existing member of rank greater than zero to exchanged to."] pub struct ExchangeMember { pub who: exchange_member::Who, pub new_who: exchange_member::NewWho, @@ -12300,7 +13334,12 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::add_member`]."] + #[doc = "Introduce a new member."] + #[doc = ""] + #[doc = "- `origin`: Must be the `AddOrigin`."] + #[doc = "- `who`: Account of non-member which will become a member."] + #[doc = ""] + #[doc = "Weight: `O(1)`"] pub fn add_member( &self, who: types::add_member::Who, @@ -12316,7 +13355,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::promote_member`]."] + #[doc = "Increment the rank of an existing member by one."] + #[doc = ""] + #[doc = "- `origin`: Must be the `PromoteOrigin`."] + #[doc = "- `who`: Account of existing member."] + #[doc = ""] + #[doc = "Weight: `O(1)`"] pub fn promote_member( &self, who: types::promote_member::Who, @@ -12333,7 +13377,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::demote_member`]."] + #[doc = "Decrement the rank of an existing member by one. If the member is already at rank zero,"] + #[doc = "then they are removed entirely."] + #[doc = ""] + #[doc = "- `origin`: Must be the `DemoteOrigin`."] + #[doc = "- `who`: Account of existing member of rank greater than zero."] + #[doc = ""] + #[doc = "Weight: `O(1)`, less if the member's index is highest in its rank."] pub fn demote_member( &self, who: types::demote_member::Who, @@ -12350,7 +13400,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remove_member`]."] + #[doc = "Remove the member entirely."] + #[doc = ""] + #[doc = "- `origin`: Must be the `RemoveOrigin`."] + #[doc = "- `who`: Account of existing member of rank greater than zero."] + #[doc = "- `min_rank`: The rank of the member or greater."] + #[doc = ""] + #[doc = "Weight: `O(min_rank)`."] pub fn remove_member( &self, who: types::remove_member::Who, @@ -12368,7 +13424,17 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::vote`]."] + #[doc = "Add an aye or nay vote for the sender to the given proposal."] + #[doc = ""] + #[doc = "- `origin`: Must be `Signed` by a member account."] + #[doc = "- `poll`: Index of a poll which is ongoing."] + #[doc = "- `aye`: `true` if the vote is to approve the proposal, `false` otherwise."] + #[doc = ""] + #[doc = "Transaction fees are be waived if the member is voting on any particular proposal"] + #[doc = "for the first time and the call is successful. Subsequent vote changes will charge a"] + #[doc = "fee."] + #[doc = ""] + #[doc = "Weight: `O(1)`, less if there was no previous vote on the poll by the member."] pub fn vote( &self, poll: types::vote::Poll, @@ -12385,7 +13451,16 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::cleanup_poll`]."] + #[doc = "Remove votes from the given poll. It must have ended."] + #[doc = ""] + #[doc = "- `origin`: Must be `Signed` by any account."] + #[doc = "- `poll_index`: Index of a poll which is completed and for which votes continue to"] + #[doc = " exist."] + #[doc = "- `max`: Maximum number of vote items from remove in this call."] + #[doc = ""] + #[doc = "Transaction fees are waived if the operation is successful."] + #[doc = ""] + #[doc = "Weight `O(max)` (less if there are fewer items to remove than `max`)."] pub fn cleanup_poll( &self, poll_index: types::cleanup_poll::PollIndex, @@ -12403,7 +13478,11 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::exchange_member`]."] + #[doc = "Exchanges a member with a new account and the same existing rank."] + #[doc = ""] + #[doc = "- `origin`: Must be the `ExchangeOrigin`."] + #[doc = "- `who`: Account of existing member of rank greater than zero to be exchanged."] + #[doc = "- `new_who`: New Account of existing member of rank greater than zero to exchanged to."] pub fn exchange_member( &self, who: types::exchange_member::Who, @@ -12599,7 +13678,7 @@ pub mod api { pub fn member_count_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::member_count::MemberCount, (), ::subxt::storage::address::Yes, @@ -12608,7 +13687,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipCollective", "MemberCount", - vec![], + (), [ 0u8, 141u8, 66u8, 91u8, 155u8, 74u8, 17u8, 191u8, 143u8, 41u8, 231u8, 56u8, 123u8, 219u8, 145u8, 27u8, 197u8, 62u8, 118u8, 237u8, 30u8, 7u8, @@ -12622,7 +13701,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::member_count::MemberCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -12631,9 +13710,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipCollective", "MemberCount", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 0u8, 141u8, 66u8, 91u8, 155u8, 74u8, 17u8, 191u8, 143u8, 41u8, 231u8, 56u8, 123u8, 219u8, 145u8, 27u8, 197u8, 62u8, 118u8, 237u8, 30u8, 7u8, @@ -12645,7 +13722,7 @@ pub mod api { pub fn members_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::members::Members, (), (), @@ -12654,7 +13731,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipCollective", "Members", - vec![], + (), [ 101u8, 183u8, 36u8, 241u8, 67u8, 8u8, 252u8, 116u8, 110u8, 153u8, 117u8, 210u8, 128u8, 80u8, 130u8, 163u8, 38u8, 76u8, 230u8, 107u8, @@ -12668,7 +13745,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::members::Members, ::subxt::storage::address::Yes, (), @@ -12677,9 +13754,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipCollective", "Members", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 101u8, 183u8, 36u8, 241u8, 67u8, 8u8, 252u8, 116u8, 110u8, 153u8, 117u8, 210u8, 128u8, 80u8, 130u8, 163u8, 38u8, 76u8, 230u8, 107u8, @@ -12692,7 +13767,7 @@ pub mod api { pub fn id_to_index_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::id_to_index::IdToIndex, (), (), @@ -12701,7 +13776,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipCollective", "IdToIndex", - vec![], + (), [ 121u8, 225u8, 69u8, 131u8, 194u8, 3u8, 82u8, 27u8, 129u8, 152u8, 157u8, 45u8, 39u8, 47u8, 166u8, 28u8, 42u8, 92u8, 217u8, 189u8, 160u8, 102u8, @@ -12714,7 +13789,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::id_to_index::IdToIndex, (), (), @@ -12723,9 +13798,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipCollective", "IdToIndex", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 121u8, 225u8, 69u8, 131u8, 194u8, 3u8, 82u8, 27u8, 129u8, 152u8, 157u8, 45u8, 39u8, 47u8, 166u8, 28u8, 42u8, 92u8, 217u8, 189u8, 160u8, 102u8, @@ -12739,7 +13812,10 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey, + ::subxt::storage::address::StaticStorageKey, + ), types::id_to_index::IdToIndex, ::subxt::storage::address::Yes, (), @@ -12748,10 +13824,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipCollective", "IdToIndex", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 121u8, 225u8, 69u8, 131u8, 194u8, 3u8, 82u8, 27u8, 129u8, 152u8, 157u8, 45u8, 39u8, 47u8, 166u8, 28u8, 42u8, 92u8, 217u8, 189u8, 160u8, 102u8, @@ -12764,7 +13840,7 @@ pub mod api { pub fn index_to_id_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::index_to_id::IndexToId, (), (), @@ -12773,7 +13849,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipCollective", "IndexToId", - vec![], + (), [ 110u8, 48u8, 214u8, 224u8, 56u8, 195u8, 186u8, 24u8, 111u8, 37u8, 15u8, 153u8, 245u8, 101u8, 229u8, 149u8, 216u8, 185u8, 7u8, 242u8, 196u8, @@ -12788,7 +13864,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::index_to_id::IndexToId, (), (), @@ -12797,9 +13873,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipCollective", "IndexToId", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 110u8, 48u8, 214u8, 224u8, 56u8, 195u8, 186u8, 24u8, 111u8, 37u8, 15u8, 153u8, 245u8, 101u8, 229u8, 149u8, 216u8, 185u8, 7u8, 242u8, 196u8, @@ -12815,7 +13889,10 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey, + ::subxt::storage::address::StaticStorageKey, + ), types::index_to_id::IndexToId, ::subxt::storage::address::Yes, (), @@ -12824,10 +13901,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipCollective", "IndexToId", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 110u8, 48u8, 214u8, 224u8, 56u8, 195u8, 186u8, 24u8, 111u8, 37u8, 15u8, 153u8, 245u8, 101u8, 229u8, 149u8, 216u8, 185u8, 7u8, 242u8, 196u8, @@ -12840,7 +13917,7 @@ pub mod api { pub fn voting_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::voting::Voting, (), (), @@ -12849,7 +13926,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipCollective", "Voting", - vec![], + (), [ 180u8, 146u8, 236u8, 178u8, 30u8, 50u8, 161u8, 50u8, 140u8, 110u8, 220u8, 1u8, 109u8, 209u8, 17u8, 94u8, 234u8, 223u8, 222u8, 177u8, @@ -12863,7 +13940,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::voting::Voting, (), (), @@ -12872,9 +13949,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipCollective", "Voting", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 180u8, 146u8, 236u8, 178u8, 30u8, 50u8, 161u8, 50u8, 140u8, 110u8, 220u8, 1u8, 109u8, 209u8, 17u8, 94u8, 234u8, 223u8, 222u8, 177u8, @@ -12889,7 +13964,10 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey, + ::subxt::storage::address::StaticStorageKey, + ), types::voting::Voting, ::subxt::storage::address::Yes, (), @@ -12898,10 +13976,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipCollective", "Voting", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 180u8, 146u8, 236u8, 178u8, 30u8, 50u8, 161u8, 50u8, 140u8, 110u8, 220u8, 1u8, 109u8, 209u8, 17u8, 94u8, 234u8, 223u8, 222u8, 177u8, @@ -12913,7 +13991,7 @@ pub mod api { pub fn voting_cleanup_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::voting_cleanup::VotingCleanup, (), (), @@ -12922,7 +14000,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipCollective", "VotingCleanup", - vec![], + (), [ 223u8, 130u8, 79u8, 104u8, 94u8, 221u8, 222u8, 72u8, 187u8, 95u8, 231u8, 59u8, 28u8, 119u8, 191u8, 63u8, 40u8, 186u8, 58u8, 254u8, 14u8, @@ -12934,7 +14012,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::voting_cleanup::VotingCleanup, ::subxt::storage::address::Yes, (), @@ -12943,9 +14021,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipCollective", "VotingCleanup", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 223u8, 130u8, 79u8, 104u8, 94u8, 221u8, 222u8, 72u8, 187u8, 95u8, 231u8, 59u8, 28u8, 119u8, 191u8, 63u8, 40u8, 186u8, 58u8, 254u8, 14u8, @@ -12979,7 +14055,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::submit`]."] + #[doc = "Propose a referendum on a privileged action."] + #[doc = ""] + #[doc = "- `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds"] + #[doc = " available."] + #[doc = "- `proposal_origin`: The origin from which the proposal should be executed."] + #[doc = "- `proposal`: The proposal."] + #[doc = "- `enactment_moment`: The moment that the proposal should be enacted."] + #[doc = ""] + #[doc = "Emits `Submitted`."] pub struct Submit { pub proposal_origin: ::std::boxed::Box, pub proposal: submit::Proposal, @@ -13011,7 +14095,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::place_decision_deposit`]."] + #[doc = "Post the Decision Deposit for a referendum."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` and the account must have funds available for the"] + #[doc = " referendum's track's Decision Deposit."] + #[doc = "- `index`: The index of the submitted referendum whose Decision Deposit is yet to be"] + #[doc = " posted."] + #[doc = ""] + #[doc = "Emits `DecisionDepositPlaced`."] pub struct PlaceDecisionDeposit { pub index: place_decision_deposit::Index, } @@ -13033,7 +14124,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::refund_decision_deposit`]."] + #[doc = "Refund the Decision Deposit for a closed referendum back to the depositor."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` or `Root`."] + #[doc = "- `index`: The index of a closed referendum whose Decision Deposit has not yet been"] + #[doc = " refunded."] + #[doc = ""] + #[doc = "Emits `DecisionDepositRefunded`."] pub struct RefundDecisionDeposit { pub index: refund_decision_deposit::Index, } @@ -13055,7 +14152,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::cancel`]."] + #[doc = "Cancel an ongoing referendum."] + #[doc = ""] + #[doc = "- `origin`: must be the `CancelOrigin`."] + #[doc = "- `index`: The index of the referendum to be cancelled."] + #[doc = ""] + #[doc = "Emits `Cancelled`."] pub struct Cancel { pub index: cancel::Index, } @@ -13077,7 +14179,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::kill`]."] + #[doc = "Cancel an ongoing referendum and slash the deposits."] + #[doc = ""] + #[doc = "- `origin`: must be the `KillOrigin`."] + #[doc = "- `index`: The index of the referendum to be cancelled."] + #[doc = ""] + #[doc = "Emits `Killed` and `DepositSlashed`."] pub struct Kill { pub index: kill::Index, } @@ -13099,7 +14206,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::nudge_referendum`]."] + #[doc = "Advance a referendum onto its next logical state. Only used internally."] + #[doc = ""] + #[doc = "- `origin`: must be `Root`."] + #[doc = "- `index`: the referendum to be advanced."] pub struct NudgeReferendum { pub index: nudge_referendum::Index, } @@ -13121,7 +14231,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::one_fewer_deciding`]."] + #[doc = "Advance a track onto its next logical state. Only used internally."] + #[doc = ""] + #[doc = "- `origin`: must be `Root`."] + #[doc = "- `track`: the track to be advanced."] + #[doc = ""] + #[doc = "Action item for when there is now one fewer referendum in the deciding phase and the"] + #[doc = "`DecidingCount` is not yet updated. This means that we should either:"] + #[doc = "- begin deciding another referendum (and leave `DecidingCount` alone); or"] + #[doc = "- decrement `DecidingCount`."] pub struct OneFewerDeciding { pub track: one_fewer_deciding::Track, } @@ -13143,7 +14261,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::refund_submission_deposit`]."] + #[doc = "Refund the Submission Deposit for a closed referendum back to the depositor."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` or `Root`."] + #[doc = "- `index`: The index of a closed referendum whose Submission Deposit has not yet been"] + #[doc = " refunded."] + #[doc = ""] + #[doc = "Emits `SubmissionDepositRefunded`."] pub struct RefundSubmissionDeposit { pub index: refund_submission_deposit::Index, } @@ -13165,7 +14289,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_metadata`]."] + #[doc = "Set or clear metadata of a referendum."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a"] + #[doc = " metadata of a finished referendum."] + #[doc = "- `index`: The index of a referendum to set or clear metadata for."] + #[doc = "- `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata."] pub struct SetMetadata { pub index: set_metadata::Index, pub maybe_hash: set_metadata::MaybeHash, @@ -13182,7 +14312,15 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::submit`]."] + #[doc = "Propose a referendum on a privileged action."] + #[doc = ""] + #[doc = "- `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds"] + #[doc = " available."] + #[doc = "- `proposal_origin`: The origin from which the proposal should be executed."] + #[doc = "- `proposal`: The proposal."] + #[doc = "- `enactment_moment`: The moment that the proposal should be enacted."] + #[doc = ""] + #[doc = "Emits `Submitted`."] pub fn submit( &self, proposal_origin: types::submit::ProposalOrigin, @@ -13204,7 +14342,14 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::place_decision_deposit`]."] + #[doc = "Post the Decision Deposit for a referendum."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` and the account must have funds available for the"] + #[doc = " referendum's track's Decision Deposit."] + #[doc = "- `index`: The index of the submitted referendum whose Decision Deposit is yet to be"] + #[doc = " posted."] + #[doc = ""] + #[doc = "Emits `DecisionDepositPlaced`."] pub fn place_decision_deposit( &self, index: types::place_decision_deposit::Index, @@ -13220,7 +14365,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::refund_decision_deposit`]."] + #[doc = "Refund the Decision Deposit for a closed referendum back to the depositor."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` or `Root`."] + #[doc = "- `index`: The index of a closed referendum whose Decision Deposit has not yet been"] + #[doc = " refunded."] + #[doc = ""] + #[doc = "Emits `DecisionDepositRefunded`."] pub fn refund_decision_deposit( &self, index: types::refund_decision_deposit::Index, @@ -13236,7 +14387,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::cancel`]."] + #[doc = "Cancel an ongoing referendum."] + #[doc = ""] + #[doc = "- `origin`: must be the `CancelOrigin`."] + #[doc = "- `index`: The index of the referendum to be cancelled."] + #[doc = ""] + #[doc = "Emits `Cancelled`."] pub fn cancel( &self, index: types::cancel::Index, @@ -13253,7 +14409,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::kill`]."] + #[doc = "Cancel an ongoing referendum and slash the deposits."] + #[doc = ""] + #[doc = "- `origin`: must be the `KillOrigin`."] + #[doc = "- `index`: The index of the referendum to be cancelled."] + #[doc = ""] + #[doc = "Emits `Killed` and `DepositSlashed`."] pub fn kill(&self, index: types::kill::Index) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "FellowshipReferenda", @@ -13267,7 +14428,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::nudge_referendum`]."] + #[doc = "Advance a referendum onto its next logical state. Only used internally."] + #[doc = ""] + #[doc = "- `origin`: must be `Root`."] + #[doc = "- `index`: the referendum to be advanced."] pub fn nudge_referendum( &self, index: types::nudge_referendum::Index, @@ -13284,7 +14448,15 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::one_fewer_deciding`]."] + #[doc = "Advance a track onto its next logical state. Only used internally."] + #[doc = ""] + #[doc = "- `origin`: must be `Root`."] + #[doc = "- `track`: the track to be advanced."] + #[doc = ""] + #[doc = "Action item for when there is now one fewer referendum in the deciding phase and the"] + #[doc = "`DecidingCount` is not yet updated. This means that we should either:"] + #[doc = "- begin deciding another referendum (and leave `DecidingCount` alone); or"] + #[doc = "- decrement `DecidingCount`."] pub fn one_fewer_deciding( &self, track: types::one_fewer_deciding::Track, @@ -13301,7 +14473,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::refund_submission_deposit`]."] + #[doc = "Refund the Submission Deposit for a closed referendum back to the depositor."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` or `Root`."] + #[doc = "- `index`: The index of a closed referendum whose Submission Deposit has not yet been"] + #[doc = " refunded."] + #[doc = ""] + #[doc = "Emits `SubmissionDepositRefunded`."] pub fn refund_submission_deposit( &self, index: types::refund_submission_deposit::Index, @@ -13317,7 +14495,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_metadata`]."] + #[doc = "Set or clear metadata of a referendum."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a"] + #[doc = " metadata of a finished referendum."] + #[doc = "- `index`: The index of a referendum to set or clear metadata for."] + #[doc = "- `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata."] pub fn set_metadata( &self, index: types::set_metadata::Index, @@ -13788,7 +14972,7 @@ pub mod api { pub fn referendum_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::referendum_count::ReferendumCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -13797,7 +14981,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipReferenda", "ReferendumCount", - vec![], + (), [ 64u8, 145u8, 232u8, 153u8, 121u8, 87u8, 128u8, 253u8, 170u8, 192u8, 139u8, 18u8, 0u8, 33u8, 243u8, 11u8, 238u8, 222u8, 244u8, 5u8, 247u8, @@ -13810,7 +14994,7 @@ pub mod api { pub fn referendum_info_for_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::referendum_info_for::ReferendumInfoFor, (), (), @@ -13819,7 +15003,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipReferenda", "ReferendumInfoFor", - vec![], + (), [ 64u8, 146u8, 31u8, 207u8, 209u8, 86u8, 44u8, 53u8, 78u8, 240u8, 222u8, 131u8, 225u8, 83u8, 114u8, 205u8, 225u8, 20u8, 128u8, 183u8, 19u8, @@ -13833,7 +15017,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::referendum_info_for::ReferendumInfoFor, ::subxt::storage::address::Yes, (), @@ -13842,9 +15026,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipReferenda", "ReferendumInfoFor", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 64u8, 146u8, 31u8, 207u8, 209u8, 86u8, 44u8, 53u8, 78u8, 240u8, 222u8, 131u8, 225u8, 83u8, 114u8, 205u8, 225u8, 20u8, 128u8, 183u8, 19u8, @@ -13860,7 +15042,7 @@ pub mod api { pub fn track_queue_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::track_queue::TrackQueue, (), ::subxt::storage::address::Yes, @@ -13869,7 +15051,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipReferenda", "TrackQueue", - vec![], + (), [ 187u8, 113u8, 225u8, 99u8, 159u8, 207u8, 182u8, 41u8, 116u8, 136u8, 119u8, 196u8, 152u8, 50u8, 192u8, 22u8, 171u8, 182u8, 237u8, 228u8, @@ -13886,7 +15068,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::track_queue::TrackQueue, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -13895,9 +15077,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipReferenda", "TrackQueue", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 187u8, 113u8, 225u8, 99u8, 159u8, 207u8, 182u8, 41u8, 116u8, 136u8, 119u8, 196u8, 152u8, 50u8, 192u8, 22u8, 171u8, 182u8, 237u8, 228u8, @@ -13910,7 +15090,7 @@ pub mod api { pub fn deciding_count_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::deciding_count::DecidingCount, (), ::subxt::storage::address::Yes, @@ -13919,7 +15099,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipReferenda", "DecidingCount", - vec![], + (), [ 203u8, 89u8, 158u8, 179u8, 194u8, 82u8, 248u8, 162u8, 93u8, 140u8, 146u8, 51u8, 110u8, 232u8, 51u8, 1u8, 128u8, 212u8, 199u8, 14u8, 182u8, @@ -13933,7 +15113,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::deciding_count::DecidingCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -13942,9 +15122,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipReferenda", "DecidingCount", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 203u8, 89u8, 158u8, 179u8, 194u8, 82u8, 248u8, 162u8, 93u8, 140u8, 146u8, 51u8, 110u8, 232u8, 51u8, 1u8, 128u8, 212u8, 199u8, 14u8, 182u8, @@ -13962,7 +15140,7 @@ pub mod api { pub fn metadata_of_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::metadata_of::MetadataOf, (), (), @@ -13971,7 +15149,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipReferenda", "MetadataOf", - vec![], + (), [ 159u8, 250u8, 56u8, 189u8, 247u8, 165u8, 206u8, 166u8, 91u8, 139u8, 124u8, 164u8, 25u8, 246u8, 199u8, 36u8, 159u8, 56u8, 227u8, 136u8, 4u8, @@ -13990,7 +15168,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::metadata_of::MetadataOf, ::subxt::storage::address::Yes, (), @@ -13999,9 +15177,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "FellowshipReferenda", "MetadataOf", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 159u8, 250u8, 56u8, 189u8, 247u8, 165u8, 206u8, 166u8, 91u8, 139u8, 124u8, 164u8, 25u8, 246u8, 199u8, 36u8, 159u8, 56u8, 227u8, 136u8, 4u8, @@ -14129,7 +15305,6 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::whitelist_call`]."] pub struct WhitelistCall { pub call_hash: whitelist_call::CallHash, } @@ -14151,7 +15326,6 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove_whitelisted_call`]."] pub struct RemoveWhitelistedCall { pub call_hash: remove_whitelisted_call::CallHash, } @@ -14173,7 +15347,6 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::dispatch_whitelisted_call`]."] pub struct DispatchWhitelistedCall { pub call_hash: dispatch_whitelisted_call::CallHash, pub call_encoded_len: dispatch_whitelisted_call::CallEncodedLen, @@ -14199,7 +15372,6 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::dispatch_whitelisted_call_with_preimage`]."] pub struct DispatchWhitelistedCallWithPreimage { pub call: ::std::boxed::Box, } @@ -14214,7 +15386,6 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::whitelist_call`]."] pub fn whitelist_call( &self, call_hash: types::whitelist_call::CallHash, @@ -14231,7 +15402,6 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remove_whitelisted_call`]."] pub fn remove_whitelisted_call( &self, call_hash: types::remove_whitelisted_call::CallHash, @@ -14248,7 +15418,6 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::dispatch_whitelisted_call`]."] pub fn dispatch_whitelisted_call( &self, call_hash: types::dispatch_whitelisted_call::CallHash, @@ -14271,7 +15440,6 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::dispatch_whitelisted_call_with_preimage`]."] pub fn dispatch_whitelisted_call_with_preimage( &self, call: types::dispatch_whitelisted_call_with_preimage::Call, @@ -14284,10 +15452,9 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 22u8, 6u8, 147u8, 82u8, 187u8, 143u8, 69u8, 45u8, 97u8, 1u8, 106u8, - 162u8, 200u8, 33u8, 243u8, 148u8, 5u8, 143u8, 227u8, 242u8, 167u8, - 120u8, 17u8, 241u8, 102u8, 162u8, 217u8, 14u8, 178u8, 75u8, 143u8, - 104u8, + 5u8, 34u8, 158u8, 60u8, 245u8, 185u8, 170u8, 44u8, 214u8, 208u8, 88u8, + 254u8, 35u8, 136u8, 207u8, 220u8, 73u8, 73u8, 39u8, 5u8, 118u8, 197u8, + 197u8, 222u8, 123u8, 52u8, 213u8, 237u8, 129u8, 4u8, 50u8, 143u8, ], ) } @@ -14383,7 +15550,7 @@ pub mod api { pub fn whitelisted_call_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::whitelisted_call::WhitelistedCall, (), (), @@ -14392,7 +15559,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Whitelist", "WhitelistedCall", - vec![], + (), [ 82u8, 208u8, 214u8, 72u8, 225u8, 35u8, 51u8, 212u8, 25u8, 138u8, 30u8, 87u8, 54u8, 232u8, 72u8, 132u8, 4u8, 9u8, 28u8, 143u8, 251u8, 106u8, @@ -14404,7 +15571,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::whitelisted_call::WhitelistedCall, ::subxt::storage::address::Yes, (), @@ -14413,9 +15580,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Whitelist", "WhitelistedCall", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 82u8, 208u8, 214u8, 72u8, 225u8, 35u8, 51u8, 212u8, 25u8, 138u8, 30u8, 87u8, 54u8, 232u8, 72u8, 132u8, 4u8, 9u8, 28u8, 143u8, 251u8, 106u8, @@ -14449,7 +15614,30 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::claim`]."] + #[doc = "Make a claim to collect your DOTs."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _None_."] + #[doc = ""] + #[doc = "Unsigned Validation:"] + #[doc = "A call to claim is deemed valid if the signature provided matches"] + #[doc = "the expected signed message of:"] + #[doc = ""] + #[doc = "> Ethereum Signed Message:"] + #[doc = "> (configured prefix string)(address)"] + #[doc = ""] + #[doc = "and `address` matches the `dest` account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `dest`: The destination account to payout the claim."] + #[doc = "- `ethereum_signature`: The signature of an ethereum signed message matching the format"] + #[doc = " described above."] + #[doc = ""] + #[doc = ""] + #[doc = "The weight of this call is invariant over the input parameters."] + #[doc = "Weight includes logic to validate unsigned `claim` call."] + #[doc = ""] + #[doc = "Total Complexity: O(1)"] + #[doc = ""] pub struct Claim { pub dest: claim::Dest, pub ethereum_signature: claim::EthereumSignature, @@ -14474,7 +15662,21 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::mint_claim`]."] + #[doc = "Mint a new claim to collect DOTs."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `who`: The Ethereum address allowed to collect this claim."] + #[doc = "- `value`: The number of DOTs that will be claimed."] + #[doc = "- `vesting_schedule`: An optional vesting schedule for these DOTs."] + #[doc = ""] + #[doc = ""] + #[doc = "The weight of this call is invariant over the input parameters."] + #[doc = "We assume worst case that both vesting and statement is being inserted."] + #[doc = ""] + #[doc = "Total Complexity: O(1)"] + #[doc = ""] pub struct MintClaim { pub who: mint_claim::Who, pub value: mint_claim::Value, @@ -14508,7 +15710,33 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::claim_attest`]."] + #[doc = "Make a claim to collect your DOTs by signing a statement."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _None_."] + #[doc = ""] + #[doc = "Unsigned Validation:"] + #[doc = "A call to `claim_attest` is deemed valid if the signature provided matches"] + #[doc = "the expected signed message of:"] + #[doc = ""] + #[doc = "> Ethereum Signed Message:"] + #[doc = "> (configured prefix string)(address)(statement)"] + #[doc = ""] + #[doc = "and `address` matches the `dest` account; the `statement` must match that which is"] + #[doc = "expected according to your purchase arrangement."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `dest`: The destination account to payout the claim."] + #[doc = "- `ethereum_signature`: The signature of an ethereum signed message matching the format"] + #[doc = " described above."] + #[doc = "- `statement`: The identity of the statement which is being attested to in the"] + #[doc = " signature."] + #[doc = ""] + #[doc = ""] + #[doc = "The weight of this call is invariant over the input parameters."] + #[doc = "Weight includes logic to validate unsigned `claim_attest` call."] + #[doc = ""] + #[doc = "Total Complexity: O(1)"] + #[doc = ""] pub struct ClaimAttest { pub dest: claim_attest::Dest, pub ethereum_signature: claim_attest::EthereumSignature, @@ -14535,7 +15763,25 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::attest`]."] + #[doc = "Attest to a statement, needed to finalize the claims process."] + #[doc = ""] + #[doc = "WARNING: Insecure unless your chain includes `PrevalidateAttests` as a"] + #[doc = "`SignedExtension`."] + #[doc = ""] + #[doc = "Unsigned Validation:"] + #[doc = "A call to attest is deemed valid if the sender has a `Preclaim` registered"] + #[doc = "and provides a `statement` which is expected for the account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `statement`: The identity of the statement which is being attested to in the"] + #[doc = " signature."] + #[doc = ""] + #[doc = ""] + #[doc = "The weight of this call is invariant over the input parameters."] + #[doc = "Weight includes logic to do pre-validation on `attest` call."] + #[doc = ""] + #[doc = "Total Complexity: O(1)"] + #[doc = ""] pub struct Attest { pub statement: attest::Statement, } @@ -14557,7 +15803,6 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::move_claim`]."] pub struct MoveClaim { pub old: move_claim::Old, pub new: move_claim::New, @@ -14576,7 +15821,30 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::claim`]."] + #[doc = "Make a claim to collect your DOTs."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _None_."] + #[doc = ""] + #[doc = "Unsigned Validation:"] + #[doc = "A call to claim is deemed valid if the signature provided matches"] + #[doc = "the expected signed message of:"] + #[doc = ""] + #[doc = "> Ethereum Signed Message:"] + #[doc = "> (configured prefix string)(address)"] + #[doc = ""] + #[doc = "and `address` matches the `dest` account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `dest`: The destination account to payout the claim."] + #[doc = "- `ethereum_signature`: The signature of an ethereum signed message matching the format"] + #[doc = " described above."] + #[doc = ""] + #[doc = ""] + #[doc = "The weight of this call is invariant over the input parameters."] + #[doc = "Weight includes logic to validate unsigned `claim` call."] + #[doc = ""] + #[doc = "Total Complexity: O(1)"] + #[doc = ""] pub fn claim( &self, dest: types::claim::Dest, @@ -14597,7 +15865,21 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::mint_claim`]."] + #[doc = "Mint a new claim to collect DOTs."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `who`: The Ethereum address allowed to collect this claim."] + #[doc = "- `value`: The number of DOTs that will be claimed."] + #[doc = "- `vesting_schedule`: An optional vesting schedule for these DOTs."] + #[doc = ""] + #[doc = ""] + #[doc = "The weight of this call is invariant over the input parameters."] + #[doc = "We assume worst case that both vesting and statement is being inserted."] + #[doc = ""] + #[doc = "Total Complexity: O(1)"] + #[doc = ""] pub fn mint_claim( &self, who: types::mint_claim::Who, @@ -14621,7 +15903,33 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::claim_attest`]."] + #[doc = "Make a claim to collect your DOTs by signing a statement."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _None_."] + #[doc = ""] + #[doc = "Unsigned Validation:"] + #[doc = "A call to `claim_attest` is deemed valid if the signature provided matches"] + #[doc = "the expected signed message of:"] + #[doc = ""] + #[doc = "> Ethereum Signed Message:"] + #[doc = "> (configured prefix string)(address)(statement)"] + #[doc = ""] + #[doc = "and `address` matches the `dest` account; the `statement` must match that which is"] + #[doc = "expected according to your purchase arrangement."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `dest`: The destination account to payout the claim."] + #[doc = "- `ethereum_signature`: The signature of an ethereum signed message matching the format"] + #[doc = " described above."] + #[doc = "- `statement`: The identity of the statement which is being attested to in the"] + #[doc = " signature."] + #[doc = ""] + #[doc = ""] + #[doc = "The weight of this call is invariant over the input parameters."] + #[doc = "Weight includes logic to validate unsigned `claim_attest` call."] + #[doc = ""] + #[doc = "Total Complexity: O(1)"] + #[doc = ""] pub fn claim_attest( &self, dest: types::claim_attest::Dest, @@ -14643,7 +15951,25 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::attest`]."] + #[doc = "Attest to a statement, needed to finalize the claims process."] + #[doc = ""] + #[doc = "WARNING: Insecure unless your chain includes `PrevalidateAttests` as a"] + #[doc = "`SignedExtension`."] + #[doc = ""] + #[doc = "Unsigned Validation:"] + #[doc = "A call to attest is deemed valid if the sender has a `Preclaim` registered"] + #[doc = "and provides a `statement` which is expected for the account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `statement`: The identity of the statement which is being attested to in the"] + #[doc = " signature."] + #[doc = ""] + #[doc = ""] + #[doc = "The weight of this call is invariant over the input parameters."] + #[doc = "Weight includes logic to do pre-validation on `attest` call."] + #[doc = ""] + #[doc = "Total Complexity: O(1)"] + #[doc = ""] pub fn attest( &self, statement: types::attest::Statement, @@ -14660,7 +15986,6 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::move_claim`]."] pub fn move_claim( &self, old: types::move_claim::Old, @@ -14760,7 +16085,7 @@ pub mod api { pub fn claims_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::claims::Claims, (), (), @@ -14769,7 +16094,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Claims", "Claims", - vec![], + (), [ 148u8, 115u8, 159u8, 169u8, 36u8, 116u8, 15u8, 108u8, 57u8, 195u8, 226u8, 180u8, 187u8, 112u8, 114u8, 63u8, 3u8, 205u8, 113u8, 141u8, @@ -14782,7 +16107,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::claims::Claims, ::subxt::storage::address::Yes, (), @@ -14791,9 +16116,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Claims", "Claims", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 148u8, 115u8, 159u8, 169u8, 36u8, 116u8, 15u8, 108u8, 57u8, 195u8, 226u8, 180u8, 187u8, 112u8, 114u8, 63u8, 3u8, 205u8, 113u8, 141u8, @@ -14805,7 +16128,7 @@ pub mod api { pub fn total( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::total::Total, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -14814,7 +16137,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Claims", "Total", - vec![], + (), [ 188u8, 31u8, 219u8, 189u8, 49u8, 213u8, 203u8, 89u8, 125u8, 58u8, 232u8, 159u8, 131u8, 155u8, 166u8, 113u8, 99u8, 24u8, 40u8, 242u8, @@ -14830,7 +16153,7 @@ pub mod api { pub fn vesting_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::vesting::Vesting, (), (), @@ -14839,7 +16162,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Claims", "Vesting", - vec![], + (), [ 206u8, 106u8, 195u8, 101u8, 55u8, 137u8, 50u8, 105u8, 137u8, 87u8, 230u8, 34u8, 255u8, 94u8, 210u8, 186u8, 179u8, 72u8, 24u8, 194u8, @@ -14856,7 +16179,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::vesting::Vesting, ::subxt::storage::address::Yes, (), @@ -14865,9 +16188,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Claims", "Vesting", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 206u8, 106u8, 195u8, 101u8, 55u8, 137u8, 50u8, 105u8, 137u8, 87u8, 230u8, 34u8, 255u8, 94u8, 210u8, 186u8, 179u8, 72u8, 24u8, 194u8, @@ -14880,7 +16201,7 @@ pub mod api { pub fn signing_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::signing::Signing, (), (), @@ -14889,7 +16210,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Claims", "Signing", - vec![], + (), [ 111u8, 90u8, 178u8, 121u8, 241u8, 28u8, 169u8, 231u8, 61u8, 189u8, 113u8, 207u8, 26u8, 153u8, 189u8, 15u8, 192u8, 25u8, 22u8, 22u8, 124u8, @@ -14902,7 +16223,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::signing::Signing, ::subxt::storage::address::Yes, (), @@ -14911,9 +16232,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Claims", "Signing", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 111u8, 90u8, 178u8, 121u8, 241u8, 28u8, 169u8, 231u8, 61u8, 189u8, 113u8, 207u8, 26u8, 153u8, 189u8, 15u8, 192u8, 25u8, 22u8, 22u8, 124u8, @@ -14925,7 +16244,7 @@ pub mod api { pub fn preclaims_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::preclaims::Preclaims, (), (), @@ -14934,7 +16253,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Claims", "Preclaims", - vec![], + (), [ 197u8, 114u8, 147u8, 235u8, 203u8, 255u8, 94u8, 113u8, 151u8, 119u8, 224u8, 147u8, 48u8, 246u8, 124u8, 38u8, 190u8, 237u8, 226u8, 65u8, @@ -14948,7 +16267,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::preclaims::Preclaims, ::subxt::storage::address::Yes, (), @@ -14957,9 +16276,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Claims", "Preclaims", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 197u8, 114u8, 147u8, 235u8, 203u8, 255u8, 94u8, 113u8, 151u8, 119u8, 224u8, 147u8, 48u8, 246u8, 124u8, 38u8, 190u8, 237u8, 226u8, 65u8, @@ -15015,7 +16332,24 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::batch`]."] + #[doc = "Send a batch of dispatch calls."] + #[doc = ""] + #[doc = "May be called from any origin except `None`."] + #[doc = ""] + #[doc = "- `calls`: The calls to be dispatched from the same origin. The number of call must not"] + #[doc = " exceed the constant: `batched_calls_limit` (available in constant metadata)."] + #[doc = ""] + #[doc = "If origin is root then the calls are dispatched without checking origin filter. (This"] + #[doc = "includes bypassing `frame_system::Config::BaseCallFilter`)."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(C) where C is the number of calls to be batched."] + #[doc = ""] + #[doc = "This will return `Ok` in all circumstances. To determine the success of the batch, an"] + #[doc = "event is deposited. If a call failed and the batch was interrupted, then the"] + #[doc = "`BatchInterrupted` event is deposited, along with the number of successful calls made"] + #[doc = "and the error of the failed call. If all were successful, then the `BatchCompleted`"] + #[doc = "event is deposited."] pub struct Batch { pub calls: batch::Calls, } @@ -15037,7 +16371,19 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::as_derivative`]."] + #[doc = "Send a call through an indexed pseudonym of the sender."] + #[doc = ""] + #[doc = "Filter from origin are passed along. The call will be dispatched with an origin which"] + #[doc = "use the same filter as the origin of this call."] + #[doc = ""] + #[doc = "NOTE: If you need to ensure that any account-based filtering is not honored (i.e."] + #[doc = "because you expect `proxy` to have been used prior in the call stack and you do not want"] + #[doc = "the call restrictions to apply to any sub-accounts), then use `as_multi_threshold_1`"] + #[doc = "in the Multisig pallet instead."] + #[doc = ""] + #[doc = "NOTE: Prior to version *12, this was called `as_limited_sub`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] pub struct AsDerivative { pub index: as_derivative::Index, pub call: ::std::boxed::Box, @@ -15061,7 +16407,19 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::batch_all`]."] + #[doc = "Send a batch of dispatch calls and atomically execute them."] + #[doc = "The whole transaction will rollback and fail if any of the calls failed."] + #[doc = ""] + #[doc = "May be called from any origin except `None`."] + #[doc = ""] + #[doc = "- `calls`: The calls to be dispatched from the same origin. The number of call must not"] + #[doc = " exceed the constant: `batched_calls_limit` (available in constant metadata)."] + #[doc = ""] + #[doc = "If origin is root then the calls are dispatched without checking origin filter. (This"] + #[doc = "includes bypassing `frame_system::Config::BaseCallFilter`)."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(C) where C is the number of calls to be batched."] pub struct BatchAll { pub calls: batch_all::Calls, } @@ -15083,7 +16441,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::dispatch_as`]."] + #[doc = "Dispatches a function call with a provided origin."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub struct DispatchAs { pub as_origin: ::std::boxed::Box, pub call: ::std::boxed::Box, @@ -15107,7 +16470,19 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_batch`]."] + #[doc = "Send a batch of dispatch calls."] + #[doc = "Unlike `batch`, it allows errors and won't interrupt."] + #[doc = ""] + #[doc = "May be called from any origin except `None`."] + #[doc = ""] + #[doc = "- `calls`: The calls to be dispatched from the same origin. The number of call must not"] + #[doc = " exceed the constant: `batched_calls_limit` (available in constant metadata)."] + #[doc = ""] + #[doc = "If origin is root then the calls are dispatch without checking origin filter. (This"] + #[doc = "includes bypassing `frame_system::Config::BaseCallFilter`)."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(C) where C is the number of calls to be batched."] pub struct ForceBatch { pub calls: force_batch::Calls, } @@ -15129,7 +16504,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::with_weight`]."] + #[doc = "Dispatch a function call with a specified weight."] + #[doc = ""] + #[doc = "This function does not check the weight of the call, and instead allows the"] + #[doc = "Root origin to specify the weight of the call."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] pub struct WithWeight { pub call: ::std::boxed::Box, pub weight: with_weight::Weight, @@ -15146,7 +16526,24 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::batch`]."] + #[doc = "Send a batch of dispatch calls."] + #[doc = ""] + #[doc = "May be called from any origin except `None`."] + #[doc = ""] + #[doc = "- `calls`: The calls to be dispatched from the same origin. The number of call must not"] + #[doc = " exceed the constant: `batched_calls_limit` (available in constant metadata)."] + #[doc = ""] + #[doc = "If origin is root then the calls are dispatched without checking origin filter. (This"] + #[doc = "includes bypassing `frame_system::Config::BaseCallFilter`)."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(C) where C is the number of calls to be batched."] + #[doc = ""] + #[doc = "This will return `Ok` in all circumstances. To determine the success of the batch, an"] + #[doc = "event is deposited. If a call failed and the batch was interrupted, then the"] + #[doc = "`BatchInterrupted` event is deposited, along with the number of successful calls made"] + #[doc = "and the error of the failed call. If all were successful, then the `BatchCompleted`"] + #[doc = "event is deposited."] pub fn batch( &self, calls: types::batch::Calls, @@ -15156,13 +16553,25 @@ pub mod api { "batch", types::Batch { calls }, [ - 190u8, 76u8, 194u8, 104u8, 12u8, 228u8, 170u8, 51u8, 80u8, 255u8, - 245u8, 201u8, 1u8, 6u8, 37u8, 123u8, 161u8, 141u8, 178u8, 35u8, 195u8, - 118u8, 25u8, 175u8, 79u8, 55u8, 53u8, 247u8, 11u8, 160u8, 207u8, 242u8, + 181u8, 127u8, 72u8, 3u8, 201u8, 66u8, 147u8, 14u8, 125u8, 58u8, 181u8, + 213u8, 122u8, 17u8, 115u8, 25u8, 62u8, 173u8, 182u8, 189u8, 10u8, + 112u8, 100u8, 66u8, 223u8, 190u8, 42u8, 175u8, 130u8, 137u8, 91u8, 0u8, ], ) } - #[doc = "See [`Pallet::as_derivative`]."] + #[doc = "Send a call through an indexed pseudonym of the sender."] + #[doc = ""] + #[doc = "Filter from origin are passed along. The call will be dispatched with an origin which"] + #[doc = "use the same filter as the origin of this call."] + #[doc = ""] + #[doc = "NOTE: If you need to ensure that any account-based filtering is not honored (i.e."] + #[doc = "because you expect `proxy` to have been used prior in the call stack and you do not want"] + #[doc = "the call restrictions to apply to any sub-accounts), then use `as_multi_threshold_1`"] + #[doc = "in the Multisig pallet instead."] + #[doc = ""] + #[doc = "NOTE: Prior to version *12, this was called `as_limited_sub`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] pub fn as_derivative( &self, index: types::as_derivative::Index, @@ -15176,14 +16585,26 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 150u8, 183u8, 64u8, 247u8, 10u8, 72u8, 40u8, 3u8, 104u8, 248u8, 146u8, - 47u8, 247u8, 114u8, 16u8, 108u8, 254u8, 162u8, 127u8, 91u8, 31u8, - 138u8, 203u8, 235u8, 247u8, 84u8, 30u8, 34u8, 228u8, 181u8, 103u8, - 246u8, + 42u8, 102u8, 244u8, 61u8, 176u8, 104u8, 53u8, 138u8, 130u8, 222u8, 2u8, + 120u8, 213u8, 145u8, 61u8, 190u8, 37u8, 201u8, 161u8, 231u8, 221u8, + 184u8, 164u8, 221u8, 246u8, 15u8, 180u8, 105u8, 174u8, 105u8, 202u8, + 204u8, ], ) } - #[doc = "See [`Pallet::batch_all`]."] + #[doc = "Send a batch of dispatch calls and atomically execute them."] + #[doc = "The whole transaction will rollback and fail if any of the calls failed."] + #[doc = ""] + #[doc = "May be called from any origin except `None`."] + #[doc = ""] + #[doc = "- `calls`: The calls to be dispatched from the same origin. The number of call must not"] + #[doc = " exceed the constant: `batched_calls_limit` (available in constant metadata)."] + #[doc = ""] + #[doc = "If origin is root then the calls are dispatched without checking origin filter. (This"] + #[doc = "includes bypassing `frame_system::Config::BaseCallFilter`)."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(C) where C is the number of calls to be batched."] pub fn batch_all( &self, calls: types::batch_all::Calls, @@ -15193,13 +16614,18 @@ pub mod api { "batch_all", types::BatchAll { calls }, [ - 93u8, 139u8, 245u8, 180u8, 137u8, 205u8, 82u8, 6u8, 172u8, 46u8, 253u8, - 155u8, 99u8, 197u8, 38u8, 242u8, 60u8, 160u8, 77u8, 73u8, 198u8, 233u8, - 204u8, 194u8, 156u8, 17u8, 64u8, 40u8, 156u8, 147u8, 212u8, 125u8, + 17u8, 73u8, 73u8, 197u8, 80u8, 151u8, 37u8, 8u8, 65u8, 201u8, 153u8, + 61u8, 81u8, 56u8, 220u8, 29u8, 176u8, 237u8, 55u8, 226u8, 209u8, 137u8, + 176u8, 146u8, 195u8, 175u8, 171u8, 69u8, 58u8, 189u8, 126u8, 120u8, ], ) } - #[doc = "See [`Pallet::dispatch_as`]."] + #[doc = "Dispatches a function call with a provided origin."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub fn dispatch_as( &self, as_origin: types::dispatch_as::AsOrigin, @@ -15213,14 +16639,25 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 46u8, 149u8, 47u8, 127u8, 211u8, 128u8, 96u8, 199u8, 179u8, 166u8, - 217u8, 15u8, 47u8, 137u8, 115u8, 124u8, 111u8, 203u8, 27u8, 54u8, 85u8, - 196u8, 162u8, 158u8, 216u8, 158u8, 184u8, 166u8, 14u8, 14u8, 104u8, - 57u8, + 26u8, 137u8, 228u8, 222u8, 250u8, 111u8, 29u8, 31u8, 210u8, 156u8, 9u8, + 151u8, 164u8, 71u8, 51u8, 228u8, 23u8, 121u8, 55u8, 27u8, 20u8, 41u8, + 198u8, 98u8, 174u8, 148u8, 124u8, 149u8, 141u8, 26u8, 17u8, 147u8, ], ) } - #[doc = "See [`Pallet::force_batch`]."] + #[doc = "Send a batch of dispatch calls."] + #[doc = "Unlike `batch`, it allows errors and won't interrupt."] + #[doc = ""] + #[doc = "May be called from any origin except `None`."] + #[doc = ""] + #[doc = "- `calls`: The calls to be dispatched from the same origin. The number of call must not"] + #[doc = " exceed the constant: `batched_calls_limit` (available in constant metadata)."] + #[doc = ""] + #[doc = "If origin is root then the calls are dispatch without checking origin filter. (This"] + #[doc = "includes bypassing `frame_system::Config::BaseCallFilter`)."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(C) where C is the number of calls to be batched."] pub fn force_batch( &self, calls: types::force_batch::Calls, @@ -15230,14 +16667,19 @@ pub mod api { "force_batch", types::ForceBatch { calls }, [ - 155u8, 161u8, 89u8, 164u8, 29u8, 151u8, 219u8, 213u8, 69u8, 167u8, - 226u8, 136u8, 117u8, 118u8, 112u8, 215u8, 137u8, 57u8, 237u8, 128u8, - 185u8, 217u8, 26u8, 24u8, 202u8, 14u8, 149u8, 113u8, 201u8, 155u8, - 203u8, 186u8, + 78u8, 200u8, 135u8, 14u8, 33u8, 152u8, 237u8, 126u8, 69u8, 160u8, 60u8, + 167u8, 206u8, 212u8, 121u8, 164u8, 192u8, 236u8, 58u8, 174u8, 37u8, + 63u8, 254u8, 178u8, 210u8, 68u8, 207u8, 154u8, 127u8, 173u8, 79u8, + 30u8, ], ) } - #[doc = "See [`Pallet::with_weight`]."] + #[doc = "Dispatch a function call with a specified weight."] + #[doc = ""] + #[doc = "This function does not check the weight of the call, and instead allows the"] + #[doc = "Root origin to specify the weight of the call."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] pub fn with_weight( &self, call: types::with_weight::Call, @@ -15251,9 +16693,9 @@ pub mod api { weight, }, [ - 47u8, 254u8, 18u8, 140u8, 124u8, 167u8, 16u8, 52u8, 50u8, 166u8, 123u8, - 107u8, 174u8, 238u8, 43u8, 129u8, 237u8, 255u8, 181u8, 210u8, 20u8, - 154u8, 96u8, 238u8, 219u8, 28u8, 74u8, 198u8, 122u8, 47u8, 13u8, 199u8, + 204u8, 3u8, 114u8, 23u8, 35u8, 43u8, 87u8, 118u8, 150u8, 70u8, 167u8, + 234u8, 87u8, 65u8, 39u8, 146u8, 138u8, 69u8, 125u8, 77u8, 84u8, 131u8, + 103u8, 92u8, 130u8, 48u8, 53u8, 170u8, 194u8, 103u8, 54u8, 184u8, ], ) } @@ -15427,7 +16869,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::add_registrar`]."] + #[doc = "Add a registrar to the system."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be `T::RegistrarOrigin`."] + #[doc = ""] + #[doc = "- `account`: the account of the registrar."] + #[doc = ""] + #[doc = "Emits `RegistrarAdded` if successful."] pub struct AddRegistrar { pub account: add_registrar::Account, } @@ -15450,7 +16898,16 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_identity`]."] + #[doc = "Set an account's identity information and reserve the appropriate deposit."] + #[doc = ""] + #[doc = "If the account already has identity information, the deposit is taken as part payment"] + #[doc = "for the new deposit."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `info`: The identity information."] + #[doc = ""] + #[doc = "Emits `IdentitySet` if successful."] pub struct SetIdentity { pub info: ::std::boxed::Box, } @@ -15472,7 +16929,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_subs`]."] + #[doc = "Set the sub-accounts of the sender."] + #[doc = ""] + #[doc = "Payment: Any aggregate balance reserved by previous `set_subs` calls will be returned"] + #[doc = "and an amount `SubAccountDeposit` will be reserved for each item in `subs`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "identity."] + #[doc = ""] + #[doc = "- `subs`: The identity's (new) sub-accounts."] pub struct SetSubs { pub subs: set_subs::Subs, } @@ -15497,7 +16962,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::clear_identity`]."] + #[doc = "Clear an account's identity info and all sub-accounts and return all deposits."] + #[doc = ""] + #[doc = "Payment: All reserved balances on the account are returned."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "identity."] + #[doc = ""] + #[doc = "Emits `IdentityCleared` if successful."] pub struct ClearIdentity; impl ::subxt::blocks::StaticExtrinsic for ClearIdentity { const PALLET: &'static str = "Identity"; @@ -15513,7 +16985,22 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::request_judgement`]."] + #[doc = "Request a judgement from a registrar."] + #[doc = ""] + #[doc = "Payment: At most `max_fee` will be reserved for payment to the registrar if judgement"] + #[doc = "given."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a"] + #[doc = "registered identity."] + #[doc = ""] + #[doc = "- `reg_index`: The index of the registrar whose judgement is requested."] + #[doc = "- `max_fee`: The maximum fee that may be paid. This should just be auto-populated as:"] + #[doc = ""] + #[doc = "```nocompile"] + #[doc = "Self::registrars().get(reg_index).unwrap().fee"] + #[doc = "```"] + #[doc = ""] + #[doc = "Emits `JudgementRequested` if successful."] pub struct RequestJudgement { #[codec(compact)] pub reg_index: request_judgement::RegIndex, @@ -15539,7 +17026,16 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::cancel_request`]."] + #[doc = "Cancel a previous request."] + #[doc = ""] + #[doc = "Payment: A previously reserved deposit is returned on success."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a"] + #[doc = "registered identity."] + #[doc = ""] + #[doc = "- `reg_index`: The index of the registrar whose judgement is no longer requested."] + #[doc = ""] + #[doc = "Emits `JudgementUnrequested` if successful."] pub struct CancelRequest { pub reg_index: cancel_request::RegIndex, } @@ -15561,7 +17057,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_fee`]."] + #[doc = "Set the fee required for a judgement to be requested from a registrar."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must be the account"] + #[doc = "of the registrar whose index is `index`."] + #[doc = ""] + #[doc = "- `index`: the index of the registrar whose fee is to be set."] + #[doc = "- `fee`: the new fee."] pub struct SetFee { #[codec(compact)] pub index: set_fee::Index, @@ -15587,7 +17089,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_account_id`]."] + #[doc = "Change the account associated with a registrar."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must be the account"] + #[doc = "of the registrar whose index is `index`."] + #[doc = ""] + #[doc = "- `index`: the index of the registrar whose fee is to be set."] + #[doc = "- `new`: the new account ID."] pub struct SetAccountId { #[codec(compact)] pub index: set_account_id::Index, @@ -15612,7 +17120,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_fields`]."] + #[doc = "Set the field information for a registrar."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must be the account"] + #[doc = "of the registrar whose index is `index`."] + #[doc = ""] + #[doc = "- `index`: the index of the registrar whose fee is to be set."] + #[doc = "- `fields`: the fields that the registrar concerns themselves with."] pub struct SetFields { #[codec(compact)] pub index: set_fields::Index, @@ -15637,7 +17151,21 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::provide_judgement`]."] + #[doc = "Provide a judgement for an account's identity."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must be the account"] + #[doc = "of the registrar whose index is `reg_index`."] + #[doc = ""] + #[doc = "- `reg_index`: the index of the registrar whose judgement is being made."] + #[doc = "- `target`: the account whose identity the judgement is upon. This must be an account"] + #[doc = " with a registered identity."] + #[doc = "- `judgement`: the judgement of the registrar of index `reg_index` about `target`."] + #[doc = "- `identity`: The hash of the [`IdentityInformationProvider`] for that the judgement is"] + #[doc = " provided."] + #[doc = ""] + #[doc = "Note: Judgements do not apply to a username."] + #[doc = ""] + #[doc = "Emits `JudgementGiven` if successful."] pub struct ProvideJudgement { #[codec(compact)] pub reg_index: provide_judgement::RegIndex, @@ -15667,7 +17195,18 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::kill_identity`]."] + #[doc = "Remove an account's identity and sub-account information and slash the deposits."] + #[doc = ""] + #[doc = "Payment: Reserved balances from `set_subs` and `set_identity` are slashed and handled by"] + #[doc = "`Slash`. Verification request deposits are not returned; they should be cancelled"] + #[doc = "manually using `cancel_request`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must match `T::ForceOrigin`."] + #[doc = ""] + #[doc = "- `target`: the account whose identity the judgement is upon. This must be an account"] + #[doc = " with a registered identity."] + #[doc = ""] + #[doc = "Emits `IdentityKilled` if successful."] pub struct KillIdentity { pub target: kill_identity::Target, } @@ -15689,7 +17228,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::add_sub`]."] + #[doc = "Add the given account to the sender's subs."] + #[doc = ""] + #[doc = "Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated"] + #[doc = "to the sender."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "sub identity of `sub`."] pub struct AddSub { pub sub: add_sub::Sub, pub data: add_sub::Data, @@ -15713,7 +17258,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::rename_sub`]."] + #[doc = "Alter the associated name of the given sub-account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "sub identity of `sub`."] pub struct RenameSub { pub sub: rename_sub::Sub, pub data: rename_sub::Data, @@ -15737,7 +17285,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove_sub`]."] + #[doc = "Remove the given account from the sender's subs."] + #[doc = ""] + #[doc = "Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated"] + #[doc = "to the sender."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "sub identity of `sub`."] pub struct RemoveSub { pub sub: remove_sub::Sub, } @@ -15759,7 +17313,16 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::quit_sub`]."] + #[doc = "Remove the sender as a sub-account."] + #[doc = ""] + #[doc = "Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated"] + #[doc = "to the sender (*not* the original depositor)."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "super-identity."] + #[doc = ""] + #[doc = "NOTE: This should not normally be used, but is provided in the case that the non-"] + #[doc = "controller of an account is maliciously registered as a sub-account."] pub struct QuitSub; impl ::subxt::blocks::StaticExtrinsic for QuitSub { const PALLET: &'static str = "Identity"; @@ -15775,7 +17338,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::add_username_authority`]."] + #[doc = "Add an `AccountId` with permission to grant usernames with a given `suffix` appended."] + #[doc = ""] + #[doc = "The authority can grant up to `allocation` usernames. To top up their allocation, they"] + #[doc = "should just issue (or request via governance) a new `add_username_authority` call."] pub struct AddUsernameAuthority { pub authority: add_username_authority::Authority, pub suffix: add_username_authority::Suffix, @@ -15802,7 +17368,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove_username_authority`]."] + #[doc = "Remove `authority` from the username authorities."] pub struct RemoveUsernameAuthority { pub authority: remove_username_authority::Authority, } @@ -15825,7 +17391,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_username_for`]."] + #[doc = "Set the username for `who`. Must be called by a username authority."] + #[doc = ""] + #[doc = "The authority must have an `allocation`. Users can either pre-sign their usernames or"] + #[doc = "accept them later."] + #[doc = ""] + #[doc = "Usernames must:"] + #[doc = " - Only contain lowercase ASCII characters or digits."] + #[doc = " - When combined with the suffix of the issuing authority be _less than_ the"] + #[doc = " `MaxUsernameLength`."] pub struct SetUsernameFor { pub who: set_username_for::Who, pub username: set_username_for::Username, @@ -15852,7 +17426,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::accept_username`]."] + #[doc = "Accept a given username that an `authority` granted. The call must include the full"] + #[doc = "username, as in `username.suffix`."] pub struct AcceptUsername { pub username: accept_username::Username, } @@ -15876,7 +17451,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove_expired_approval`]."] + #[doc = "Remove an expired username approval. The username was approved by an authority but never"] + #[doc = "accepted by the user and must now be beyond its expiration. The call must include the"] + #[doc = "full username, as in `username.suffix`."] pub struct RemoveExpiredApproval { pub username: remove_expired_approval::Username, } @@ -15900,7 +17477,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_primary_username`]."] + #[doc = "Set a given username as the primary. The username should include the suffix."] pub struct SetPrimaryUsername { pub username: set_primary_username::Username, } @@ -15924,7 +17501,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove_dangling_username`]."] + #[doc = "Remove a username that corresponds to an account with no identity. Exists when a user"] + #[doc = "gets a username but then calls `clear_identity`."] pub struct RemoveDanglingUsername { pub username: remove_dangling_username::Username, } @@ -15941,7 +17519,13 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::add_registrar`]."] + #[doc = "Add a registrar to the system."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be `T::RegistrarOrigin`."] + #[doc = ""] + #[doc = "- `account`: the account of the registrar."] + #[doc = ""] + #[doc = "Emits `RegistrarAdded` if successful."] pub fn add_registrar( &self, account: types::add_registrar::Account, @@ -15957,7 +17541,16 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_identity`]."] + #[doc = "Set an account's identity information and reserve the appropriate deposit."] + #[doc = ""] + #[doc = "If the account already has identity information, the deposit is taken as part payment"] + #[doc = "for the new deposit."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `info`: The identity information."] + #[doc = ""] + #[doc = "Emits `IdentitySet` if successful."] pub fn set_identity( &self, info: types::set_identity::Info, @@ -15976,7 +17569,15 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_subs`]."] + #[doc = "Set the sub-accounts of the sender."] + #[doc = ""] + #[doc = "Payment: Any aggregate balance reserved by previous `set_subs` calls will be returned"] + #[doc = "and an amount `SubAccountDeposit` will be reserved for each item in `subs`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "identity."] + #[doc = ""] + #[doc = "- `subs`: The identity's (new) sub-accounts."] pub fn set_subs( &self, subs: types::set_subs::Subs, @@ -15993,7 +17594,14 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::clear_identity`]."] + #[doc = "Clear an account's identity info and all sub-accounts and return all deposits."] + #[doc = ""] + #[doc = "Payment: All reserved balances on the account are returned."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "identity."] + #[doc = ""] + #[doc = "Emits `IdentityCleared` if successful."] pub fn clear_identity(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Identity", @@ -16007,7 +17615,22 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::request_judgement`]."] + #[doc = "Request a judgement from a registrar."] + #[doc = ""] + #[doc = "Payment: At most `max_fee` will be reserved for payment to the registrar if judgement"] + #[doc = "given."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a"] + #[doc = "registered identity."] + #[doc = ""] + #[doc = "- `reg_index`: The index of the registrar whose judgement is requested."] + #[doc = "- `max_fee`: The maximum fee that may be paid. This should just be auto-populated as:"] + #[doc = ""] + #[doc = "```nocompile"] + #[doc = "Self::registrars().get(reg_index).unwrap().fee"] + #[doc = "```"] + #[doc = ""] + #[doc = "Emits `JudgementRequested` if successful."] pub fn request_judgement( &self, reg_index: types::request_judgement::RegIndex, @@ -16024,7 +17647,16 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::cancel_request`]."] + #[doc = "Cancel a previous request."] + #[doc = ""] + #[doc = "Payment: A previously reserved deposit is returned on success."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a"] + #[doc = "registered identity."] + #[doc = ""] + #[doc = "- `reg_index`: The index of the registrar whose judgement is no longer requested."] + #[doc = ""] + #[doc = "Emits `JudgementUnrequested` if successful."] pub fn cancel_request( &self, reg_index: types::cancel_request::RegIndex, @@ -16041,7 +17673,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_fee`]."] + #[doc = "Set the fee required for a judgement to be requested from a registrar."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must be the account"] + #[doc = "of the registrar whose index is `index`."] + #[doc = ""] + #[doc = "- `index`: the index of the registrar whose fee is to be set."] + #[doc = "- `fee`: the new fee."] pub fn set_fee( &self, index: types::set_fee::Index, @@ -16059,7 +17697,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_account_id`]."] + #[doc = "Change the account associated with a registrar."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must be the account"] + #[doc = "of the registrar whose index is `index`."] + #[doc = ""] + #[doc = "- `index`: the index of the registrar whose fee is to be set."] + #[doc = "- `new`: the new account ID."] pub fn set_account_id( &self, index: types::set_account_id::Index, @@ -16077,7 +17721,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_fields`]."] + #[doc = "Set the field information for a registrar."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must be the account"] + #[doc = "of the registrar whose index is `index`."] + #[doc = ""] + #[doc = "- `index`: the index of the registrar whose fee is to be set."] + #[doc = "- `fields`: the fields that the registrar concerns themselves with."] pub fn set_fields( &self, index: types::set_fields::Index, @@ -16095,7 +17745,21 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::provide_judgement`]."] + #[doc = "Provide a judgement for an account's identity."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must be the account"] + #[doc = "of the registrar whose index is `reg_index`."] + #[doc = ""] + #[doc = "- `reg_index`: the index of the registrar whose judgement is being made."] + #[doc = "- `target`: the account whose identity the judgement is upon. This must be an account"] + #[doc = " with a registered identity."] + #[doc = "- `judgement`: the judgement of the registrar of index `reg_index` about `target`."] + #[doc = "- `identity`: The hash of the [`IdentityInformationProvider`] for that the judgement is"] + #[doc = " provided."] + #[doc = ""] + #[doc = "Note: Judgements do not apply to a username."] + #[doc = ""] + #[doc = "Emits `JudgementGiven` if successful."] pub fn provide_judgement( &self, reg_index: types::provide_judgement::RegIndex, @@ -16120,7 +17784,18 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::kill_identity`]."] + #[doc = "Remove an account's identity and sub-account information and slash the deposits."] + #[doc = ""] + #[doc = "Payment: Reserved balances from `set_subs` and `set_identity` are slashed and handled by"] + #[doc = "`Slash`. Verification request deposits are not returned; they should be cancelled"] + #[doc = "manually using `cancel_request`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must match `T::ForceOrigin`."] + #[doc = ""] + #[doc = "- `target`: the account whose identity the judgement is upon. This must be an account"] + #[doc = " with a registered identity."] + #[doc = ""] + #[doc = "Emits `IdentityKilled` if successful."] pub fn kill_identity( &self, target: types::kill_identity::Target, @@ -16137,7 +17812,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::add_sub`]."] + #[doc = "Add the given account to the sender's subs."] + #[doc = ""] + #[doc = "Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated"] + #[doc = "to the sender."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "sub identity of `sub`."] pub fn add_sub( &self, sub: types::add_sub::Sub, @@ -16154,7 +17835,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::rename_sub`]."] + #[doc = "Alter the associated name of the given sub-account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "sub identity of `sub`."] pub fn rename_sub( &self, sub: types::rename_sub::Sub, @@ -16172,7 +17856,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remove_sub`]."] + #[doc = "Remove the given account from the sender's subs."] + #[doc = ""] + #[doc = "Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated"] + #[doc = "to the sender."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "sub identity of `sub`."] pub fn remove_sub( &self, sub: types::remove_sub::Sub, @@ -16188,7 +17878,16 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::quit_sub`]."] + #[doc = "Remove the sender as a sub-account."] + #[doc = ""] + #[doc = "Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated"] + #[doc = "to the sender (*not* the original depositor)."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "super-identity."] + #[doc = ""] + #[doc = "NOTE: This should not normally be used, but is provided in the case that the non-"] + #[doc = "controller of an account is maliciously registered as a sub-account."] pub fn quit_sub(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Identity", @@ -16202,7 +17901,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::add_username_authority`]."] + #[doc = "Add an `AccountId` with permission to grant usernames with a given `suffix` appended."] + #[doc = ""] + #[doc = "The authority can grant up to `allocation` usernames. To top up their allocation, they"] + #[doc = "should just issue (or request via governance) a new `add_username_authority` call."] pub fn add_username_authority( &self, authority: types::add_username_authority::Authority, @@ -16225,7 +17927,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remove_username_authority`]."] + #[doc = "Remove `authority` from the username authorities."] pub fn remove_username_authority( &self, authority: types::remove_username_authority::Authority, @@ -16241,7 +17943,15 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_username_for`]."] + #[doc = "Set the username for `who`. Must be called by a username authority."] + #[doc = ""] + #[doc = "The authority must have an `allocation`. Users can either pre-sign their usernames or"] + #[doc = "accept them later."] + #[doc = ""] + #[doc = "Usernames must:"] + #[doc = " - Only contain lowercase ASCII characters or digits."] + #[doc = " - When combined with the suffix of the issuing authority be _less than_ the"] + #[doc = " `MaxUsernameLength`."] pub fn set_username_for( &self, who: types::set_username_for::Who, @@ -16264,7 +17974,8 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::accept_username`]."] + #[doc = "Accept a given username that an `authority` granted. The call must include the full"] + #[doc = "username, as in `username.suffix`."] pub fn accept_username( &self, username: types::accept_username::Username, @@ -16280,7 +17991,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remove_expired_approval`]."] + #[doc = "Remove an expired username approval. The username was approved by an authority but never"] + #[doc = "accepted by the user and must now be beyond its expiration. The call must include the"] + #[doc = "full username, as in `username.suffix`."] pub fn remove_expired_approval( &self, username: types::remove_expired_approval::Username, @@ -16296,7 +18009,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_primary_username`]."] + #[doc = "Set a given username as the primary. The username should include the suffix."] pub fn set_primary_username( &self, username: types::set_primary_username::Username, @@ -16312,7 +18025,8 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remove_dangling_username`]."] + #[doc = "Remove a username that corresponds to an account with no identity. Exists when a user"] + #[doc = "gets a username but then calls `clear_identity`."] pub fn remove_dangling_username( &self, username: types::remove_dangling_username::Username, @@ -16836,7 +18550,7 @@ pub mod api { pub fn identity_of_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::identity_of::IdentityOf, (), (), @@ -16845,7 +18559,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Identity", "IdentityOf", - vec![], + (), [ 0u8, 73u8, 213u8, 52u8, 49u8, 235u8, 238u8, 43u8, 119u8, 12u8, 35u8, 162u8, 230u8, 24u8, 246u8, 200u8, 44u8, 254u8, 13u8, 84u8, 10u8, 27u8, @@ -16861,7 +18575,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::identity_of::IdentityOf, ::subxt::storage::address::Yes, (), @@ -16870,9 +18584,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Identity", "IdentityOf", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 0u8, 73u8, 213u8, 52u8, 49u8, 235u8, 238u8, 43u8, 119u8, 12u8, 35u8, 162u8, 230u8, 24u8, 246u8, 200u8, 44u8, 254u8, 13u8, 84u8, 10u8, 27u8, @@ -16885,7 +18597,7 @@ pub mod api { pub fn super_of_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::super_of::SuperOf, (), (), @@ -16894,7 +18606,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Identity", "SuperOf", - vec![], + (), [ 84u8, 72u8, 64u8, 14u8, 56u8, 9u8, 143u8, 100u8, 141u8, 163u8, 36u8, 55u8, 38u8, 254u8, 164u8, 17u8, 3u8, 110u8, 88u8, 175u8, 161u8, 65u8, @@ -16908,7 +18620,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::super_of::SuperOf, ::subxt::storage::address::Yes, (), @@ -16917,9 +18629,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Identity", "SuperOf", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 84u8, 72u8, 64u8, 14u8, 56u8, 9u8, 143u8, 100u8, 141u8, 163u8, 36u8, 55u8, 38u8, 254u8, 164u8, 17u8, 3u8, 110u8, 88u8, 175u8, 161u8, 65u8, @@ -16935,7 +18645,7 @@ pub mod api { pub fn subs_of_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::subs_of::SubsOf, (), ::subxt::storage::address::Yes, @@ -16944,7 +18654,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Identity", "SubsOf", - vec![], + (), [ 164u8, 140u8, 52u8, 123u8, 220u8, 118u8, 147u8, 3u8, 67u8, 22u8, 191u8, 18u8, 186u8, 21u8, 154u8, 8u8, 205u8, 224u8, 163u8, 173u8, 174u8, @@ -16962,7 +18672,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::subs_of::SubsOf, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -16971,9 +18681,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Identity", "SubsOf", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 164u8, 140u8, 52u8, 123u8, 220u8, 118u8, 147u8, 3u8, 67u8, 22u8, 191u8, 18u8, 186u8, 21u8, 154u8, 8u8, 205u8, 224u8, 163u8, 173u8, 174u8, @@ -16989,7 +18697,7 @@ pub mod api { pub fn registrars( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::registrars::Registrars, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -16998,7 +18706,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Identity", "Registrars", - vec![], + (), [ 167u8, 99u8, 159u8, 117u8, 103u8, 243u8, 208u8, 113u8, 57u8, 225u8, 27u8, 25u8, 188u8, 120u8, 15u8, 40u8, 134u8, 169u8, 108u8, 134u8, 83u8, @@ -17011,7 +18719,7 @@ pub mod api { pub fn username_authorities_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::username_authorities::UsernameAuthorities, (), (), @@ -17020,7 +18728,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Identity", "UsernameAuthorities", - vec![], + (), [ 89u8, 102u8, 60u8, 184u8, 127u8, 244u8, 3u8, 61u8, 209u8, 78u8, 178u8, 44u8, 159u8, 27u8, 7u8, 0u8, 22u8, 116u8, 42u8, 240u8, 130u8, 93u8, @@ -17033,7 +18741,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::username_authorities::Param0, + >, types::username_authorities::UsernameAuthorities, ::subxt::storage::address::Yes, (), @@ -17042,9 +18752,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Identity", "UsernameAuthorities", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 89u8, 102u8, 60u8, 184u8, 127u8, 244u8, 3u8, 61u8, 209u8, 78u8, 178u8, 44u8, 159u8, 27u8, 7u8, 0u8, 22u8, 116u8, 42u8, 240u8, 130u8, 93u8, @@ -17060,7 +18768,7 @@ pub mod api { pub fn account_of_username_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::account_of_username::AccountOfUsername, (), (), @@ -17069,7 +18777,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Identity", "AccountOfUsername", - vec![], + (), [ 131u8, 96u8, 207u8, 217u8, 223u8, 54u8, 51u8, 156u8, 8u8, 238u8, 134u8, 57u8, 42u8, 110u8, 180u8, 107u8, 30u8, 109u8, 162u8, 110u8, 178u8, @@ -17087,7 +18795,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::account_of_username::AccountOfUsername, ::subxt::storage::address::Yes, (), @@ -17096,9 +18804,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Identity", "AccountOfUsername", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 131u8, 96u8, 207u8, 217u8, 223u8, 54u8, 51u8, 156u8, 8u8, 238u8, 134u8, 57u8, 42u8, 110u8, 180u8, 107u8, 30u8, 109u8, 162u8, 110u8, 178u8, @@ -17116,7 +18822,7 @@ pub mod api { pub fn pending_usernames_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::pending_usernames::PendingUsernames, (), (), @@ -17125,7 +18831,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Identity", "PendingUsernames", - vec![], + (), [ 237u8, 213u8, 92u8, 249u8, 11u8, 169u8, 104u8, 7u8, 201u8, 133u8, 164u8, 64u8, 191u8, 172u8, 169u8, 229u8, 206u8, 105u8, 190u8, 113u8, @@ -17144,7 +18850,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::pending_usernames::PendingUsernames, ::subxt::storage::address::Yes, (), @@ -17153,9 +18859,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Identity", "PendingUsernames", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 237u8, 213u8, 92u8, 249u8, 11u8, 169u8, 104u8, 7u8, 201u8, 133u8, 164u8, 64u8, 191u8, 172u8, 169u8, 229u8, 206u8, 105u8, 190u8, 113u8, @@ -17314,7 +19018,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::bid`]."] + #[doc = "A user outside of the society can make a bid for entry."] + #[doc = ""] + #[doc = "Payment: The group's Candidate Deposit will be reserved for making a bid. It is returned"] + #[doc = "when the bid becomes a member, or if the bid calls `unbid`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `value`: A one time payment the bid would like to receive when joining the society."] pub struct Bid { pub value: bid::Value, } @@ -17336,7 +19048,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::unbid`]."] + #[doc = "A bidder can remove their bid for entry into society."] + #[doc = "By doing so, they will have their candidate deposit returned or"] + #[doc = "they will unvouch their voucher."] + #[doc = ""] + #[doc = "Payment: The bid deposit is unreserved if the user made a bid."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a bidder."] pub struct Unbid; impl ::subxt::blocks::StaticExtrinsic for Unbid { const PALLET: &'static str = "Society"; @@ -17352,7 +19070,23 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::vouch`]."] + #[doc = "As a member, vouch for someone to join society by placing a bid on their behalf."] + #[doc = ""] + #[doc = "There is no deposit required to vouch for a new bid, but a member can only vouch for"] + #[doc = "one bid at a time. If the bid becomes a suspended candidate and ultimately rejected by"] + #[doc = "the suspension judgement origin, the member will be banned from vouching again."] + #[doc = ""] + #[doc = "As a vouching member, you can claim a tip if the candidate is accepted. This tip will"] + #[doc = "be paid as a portion of the reward the member will receive for joining the society."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a member."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `who`: The user who you would like to vouch for."] + #[doc = "- `value`: The total reward to be paid between you and the candidate if they become"] + #[doc = "a member in the society."] + #[doc = "- `tip`: Your cut of the total `value` payout when the candidate is inducted into"] + #[doc = "the society. Tips larger than `value` will be saturated upon payout."] pub struct Vouch { pub who: vouch::Who, pub value: vouch::Value, @@ -17378,7 +19112,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::unvouch`]."] + #[doc = "As a vouching member, unvouch a bid. This only works while vouched user is"] + #[doc = "only a bidder (and not a candidate)."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a vouching member."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `pos`: Position in the `Bids` vector of the bid who should be unvouched."] pub struct Unvouch; impl ::subxt::blocks::StaticExtrinsic for Unvouch { const PALLET: &'static str = "Society"; @@ -17394,7 +19134,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::vote`]."] + #[doc = "As a member, vote on a candidate."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a member."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `candidate`: The candidate that the member would like to bid on."] + #[doc = "- `approve`: A boolean which says if the candidate should be approved (`true`) or"] + #[doc = " rejected (`false`)."] pub struct Vote { pub candidate: vote::Candidate, pub approve: vote::Approve, @@ -17419,7 +19166,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::defender_vote`]."] + #[doc = "As a member, vote on the defender."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a member."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `approve`: A boolean which says if the candidate should be"] + #[doc = "approved (`true`) or rejected (`false`)."] pub struct DefenderVote { pub approve: defender_vote::Approve, } @@ -17441,7 +19194,16 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::payout`]."] + #[doc = "Transfer the first matured payout for the sender and remove it from the records."] + #[doc = ""] + #[doc = "NOTE: This extrinsic needs to be called multiple times to claim multiple matured"] + #[doc = "payouts."] + #[doc = ""] + #[doc = "Payment: The member will receive a payment equal to their first matured"] + #[doc = "payout to their free balance."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a member with"] + #[doc = "payouts remaining."] pub struct Payout; impl ::subxt::blocks::StaticExtrinsic for Payout { const PALLET: &'static str = "Society"; @@ -17457,7 +19219,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::waive_repay`]."] + #[doc = "Repay the payment previously given to the member with the signed origin, remove any"] + #[doc = "pending payments, and elevate them from rank 0 to rank 1."] pub struct WaiveRepay { pub amount: waive_repay::Amount, } @@ -17479,7 +19242,23 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::found_society`]."] + #[doc = "Found the society."] + #[doc = ""] + #[doc = "This is done as a discrete action in order to allow for the"] + #[doc = "pallet to be included into a running chain and can only be done once."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be from the _FounderSetOrigin_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `founder` - The first member and head of the newly founded society."] + #[doc = "- `max_members` - The initial max number of members for the society."] + #[doc = "- `max_intake` - The maximum number of candidates per intake period."] + #[doc = "- `max_strikes`: The maximum number of strikes a member may get before they become"] + #[doc = " suspended and may only be reinstated by the founder."] + #[doc = "- `candidate_deposit`: The deposit required to make a bid for membership of the group."] + #[doc = "- `rules` - The rules of this society concerning membership."] + #[doc = ""] + #[doc = "Complexity: O(1)"] pub struct FoundSociety { pub founder: found_society::Founder, pub max_members: found_society::MaxMembers, @@ -17512,7 +19291,11 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::dissolve`]."] + #[doc = "Dissolve the society and remove all members."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be Signed, and the signing account must be both"] + #[doc = "the `Founder` and the `Head`. This implies that it may only be done when there is one"] + #[doc = "member."] pub struct Dissolve; impl ::subxt::blocks::StaticExtrinsic for Dissolve { const PALLET: &'static str = "Society"; @@ -17528,7 +19311,20 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::judge_suspended_member`]."] + #[doc = "Allow suspension judgement origin to make judgement on a suspended member."] + #[doc = ""] + #[doc = "If a suspended member is forgiven, we simply add them back as a member, not affecting"] + #[doc = "any of the existing storage items for that member."] + #[doc = ""] + #[doc = "If a suspended member is rejected, remove all associated storage items, including"] + #[doc = "their payouts, and remove any vouched bids they currently have."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be Signed from the Founder."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `who` - The suspended member to be judged."] + #[doc = "- `forgive` - A boolean representing whether the suspension judgement origin forgives"] + #[doc = " (`true`) or rejects (`false`) a suspended member."] pub struct JudgeSuspendedMember { pub who: judge_suspended_member::Who, pub forgive: judge_suspended_member::Forgive, @@ -17552,7 +19348,18 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_parameters`]."] + #[doc = "Change the maximum number of members in society and the maximum number of new candidates"] + #[doc = "in a single intake period."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be Signed by the Founder."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `max_members` - The maximum number of members for the society. This must be no less"] + #[doc = " than the current number of members."] + #[doc = "- `max_intake` - The maximum number of candidates per intake period."] + #[doc = "- `max_strikes`: The maximum number of strikes a member may get before they become"] + #[doc = " suspended and may only be reinstated by the founder."] + #[doc = "- `candidate_deposit`: The deposit required to make a bid for membership of the group."] pub struct SetParameters { pub max_members: set_parameters::MaxMembers, pub max_intake: set_parameters::MaxIntake, @@ -17580,7 +19387,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::punish_skeptic`]."] + #[doc = "Punish the skeptic with a strike if they did not vote on a candidate. Callable by the"] + #[doc = "candidate."] pub struct PunishSkeptic; impl ::subxt::blocks::StaticExtrinsic for PunishSkeptic { const PALLET: &'static str = "Society"; @@ -17596,7 +19404,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::claim_membership`]."] + #[doc = "Transform an approved candidate into a member. Callable only by the"] + #[doc = "the candidate, and only after the period for voting has ended."] pub struct ClaimMembership; impl ::subxt::blocks::StaticExtrinsic for ClaimMembership { const PALLET: &'static str = "Society"; @@ -17612,7 +19421,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::bestow_membership`]."] + #[doc = "Transform an approved candidate into a member. Callable only by the Signed origin of the"] + #[doc = "Founder, only after the period for voting has ended and only when the candidate is not"] + #[doc = "clearly rejected."] pub struct BestowMembership { pub candidate: bestow_membership::Candidate, } @@ -17634,7 +19445,11 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::kick_candidate`]."] + #[doc = "Remove the candidate's application from the society. Callable only by the Signed origin"] + #[doc = "of the Founder, only after the period for voting has ended, and only when they do not"] + #[doc = "have a clear approval."] + #[doc = ""] + #[doc = "Any bid deposit is lost and voucher is banned."] pub struct KickCandidate { pub candidate: kick_candidate::Candidate, } @@ -17656,7 +19471,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::resign_candidacy`]."] + #[doc = "Remove the candidate's application from the society. Callable only by the candidate."] + #[doc = ""] + #[doc = "Any bid deposit is lost and voucher is banned."] pub struct ResignCandidacy; impl ::subxt::blocks::StaticExtrinsic for ResignCandidacy { const PALLET: &'static str = "Society"; @@ -17672,7 +19489,11 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::drop_candidate`]."] + #[doc = "Remove a `candidate`'s failed application from the society. Callable by any"] + #[doc = "signed origin but only at the end of the subsequent round and only for"] + #[doc = "a candidate with more rejections than approvals."] + #[doc = ""] + #[doc = "The bid deposit is lost and the voucher is banned."] pub struct DropCandidate { pub candidate: drop_candidate::Candidate, } @@ -17694,7 +19515,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::cleanup_candidacy`]."] + #[doc = "Remove up to `max` stale votes for the given `candidate`."] + #[doc = ""] + #[doc = "May be called by any Signed origin, but only after the candidate's candidacy is ended."] pub struct CleanupCandidacy { pub candidate: cleanup_candidacy::Candidate, pub max: cleanup_candidacy::Max, @@ -17718,7 +19541,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::cleanup_challenge`]."] + #[doc = "Remove up to `max` stale votes for the defender in the given `challenge_round`."] + #[doc = ""] + #[doc = "May be called by any Signed origin, but only after the challenge round is ended."] pub struct CleanupChallenge { pub challenge_round: cleanup_challenge::ChallengeRound, pub max: cleanup_challenge::Max, @@ -17735,7 +19560,15 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::bid`]."] + #[doc = "A user outside of the society can make a bid for entry."] + #[doc = ""] + #[doc = "Payment: The group's Candidate Deposit will be reserved for making a bid. It is returned"] + #[doc = "when the bid becomes a member, or if the bid calls `unbid`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `value`: A one time payment the bid would like to receive when joining the society."] pub fn bid(&self, value: types::bid::Value) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Society", @@ -17748,7 +19581,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::unbid`]."] + #[doc = "A bidder can remove their bid for entry into society."] + #[doc = "By doing so, they will have their candidate deposit returned or"] + #[doc = "they will unvouch their voucher."] + #[doc = ""] + #[doc = "Payment: The bid deposit is unreserved if the user made a bid."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a bidder."] pub fn unbid(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Society", @@ -17762,7 +19601,23 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::vouch`]."] + #[doc = "As a member, vouch for someone to join society by placing a bid on their behalf."] + #[doc = ""] + #[doc = "There is no deposit required to vouch for a new bid, but a member can only vouch for"] + #[doc = "one bid at a time. If the bid becomes a suspended candidate and ultimately rejected by"] + #[doc = "the suspension judgement origin, the member will be banned from vouching again."] + #[doc = ""] + #[doc = "As a vouching member, you can claim a tip if the candidate is accepted. This tip will"] + #[doc = "be paid as a portion of the reward the member will receive for joining the society."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a member."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `who`: The user who you would like to vouch for."] + #[doc = "- `value`: The total reward to be paid between you and the candidate if they become"] + #[doc = "a member in the society."] + #[doc = "- `tip`: Your cut of the total `value` payout when the candidate is inducted into"] + #[doc = "the society. Tips larger than `value` will be saturated upon payout."] pub fn vouch( &self, who: types::vouch::Who, @@ -17780,7 +19635,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::unvouch`]."] + #[doc = "As a vouching member, unvouch a bid. This only works while vouched user is"] + #[doc = "only a bidder (and not a candidate)."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a vouching member."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `pos`: Position in the `Bids` vector of the bid who should be unvouched."] pub fn unvouch(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Society", @@ -17794,7 +19655,14 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::vote`]."] + #[doc = "As a member, vote on a candidate."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a member."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `candidate`: The candidate that the member would like to bid on."] + #[doc = "- `approve`: A boolean which says if the candidate should be approved (`true`) or"] + #[doc = " rejected (`false`)."] pub fn vote( &self, candidate: types::vote::Candidate, @@ -17811,7 +19679,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::defender_vote`]."] + #[doc = "As a member, vote on the defender."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a member."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `approve`: A boolean which says if the candidate should be"] + #[doc = "approved (`true`) or rejected (`false`)."] pub fn defender_vote( &self, approve: types::defender_vote::Approve, @@ -17828,7 +19702,16 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::payout`]."] + #[doc = "Transfer the first matured payout for the sender and remove it from the records."] + #[doc = ""] + #[doc = "NOTE: This extrinsic needs to be called multiple times to claim multiple matured"] + #[doc = "payouts."] + #[doc = ""] + #[doc = "Payment: The member will receive a payment equal to their first matured"] + #[doc = "payout to their free balance."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a member with"] + #[doc = "payouts remaining."] pub fn payout(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Society", @@ -17841,7 +19724,8 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::waive_repay`]."] + #[doc = "Repay the payment previously given to the member with the signed origin, remove any"] + #[doc = "pending payments, and elevate them from rank 0 to rank 1."] pub fn waive_repay( &self, amount: types::waive_repay::Amount, @@ -17857,7 +19741,23 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::found_society`]."] + #[doc = "Found the society."] + #[doc = ""] + #[doc = "This is done as a discrete action in order to allow for the"] + #[doc = "pallet to be included into a running chain and can only be done once."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be from the _FounderSetOrigin_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `founder` - The first member and head of the newly founded society."] + #[doc = "- `max_members` - The initial max number of members for the society."] + #[doc = "- `max_intake` - The maximum number of candidates per intake period."] + #[doc = "- `max_strikes`: The maximum number of strikes a member may get before they become"] + #[doc = " suspended and may only be reinstated by the founder."] + #[doc = "- `candidate_deposit`: The deposit required to make a bid for membership of the group."] + #[doc = "- `rules` - The rules of this society concerning membership."] + #[doc = ""] + #[doc = "Complexity: O(1)"] pub fn found_society( &self, founder: types::found_society::Founder, @@ -17886,7 +19786,11 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::dissolve`]."] + #[doc = "Dissolve the society and remove all members."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be Signed, and the signing account must be both"] + #[doc = "the `Founder` and the `Head`. This implies that it may only be done when there is one"] + #[doc = "member."] pub fn dissolve(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Society", @@ -17900,7 +19804,20 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::judge_suspended_member`]."] + #[doc = "Allow suspension judgement origin to make judgement on a suspended member."] + #[doc = ""] + #[doc = "If a suspended member is forgiven, we simply add them back as a member, not affecting"] + #[doc = "any of the existing storage items for that member."] + #[doc = ""] + #[doc = "If a suspended member is rejected, remove all associated storage items, including"] + #[doc = "their payouts, and remove any vouched bids they currently have."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be Signed from the Founder."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `who` - The suspended member to be judged."] + #[doc = "- `forgive` - A boolean representing whether the suspension judgement origin forgives"] + #[doc = " (`true`) or rejects (`false`) a suspended member."] pub fn judge_suspended_member( &self, who: types::judge_suspended_member::Who, @@ -17917,7 +19834,18 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_parameters`]."] + #[doc = "Change the maximum number of members in society and the maximum number of new candidates"] + #[doc = "in a single intake period."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be Signed by the Founder."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `max_members` - The maximum number of members for the society. This must be no less"] + #[doc = " than the current number of members."] + #[doc = "- `max_intake` - The maximum number of candidates per intake period."] + #[doc = "- `max_strikes`: The maximum number of strikes a member may get before they become"] + #[doc = " suspended and may only be reinstated by the founder."] + #[doc = "- `candidate_deposit`: The deposit required to make a bid for membership of the group."] pub fn set_parameters( &self, max_members: types::set_parameters::MaxMembers, @@ -17942,7 +19870,8 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::punish_skeptic`]."] + #[doc = "Punish the skeptic with a strike if they did not vote on a candidate. Callable by the"] + #[doc = "candidate."] pub fn punish_skeptic(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Society", @@ -17956,7 +19885,8 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::claim_membership`]."] + #[doc = "Transform an approved candidate into a member. Callable only by the"] + #[doc = "the candidate, and only after the period for voting has ended."] pub fn claim_membership(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Society", @@ -17969,7 +19899,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::bestow_membership`]."] + #[doc = "Transform an approved candidate into a member. Callable only by the Signed origin of the"] + #[doc = "Founder, only after the period for voting has ended and only when the candidate is not"] + #[doc = "clearly rejected."] pub fn bestow_membership( &self, candidate: types::bestow_membership::Candidate, @@ -17985,7 +19917,11 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::kick_candidate`]."] + #[doc = "Remove the candidate's application from the society. Callable only by the Signed origin"] + #[doc = "of the Founder, only after the period for voting has ended, and only when they do not"] + #[doc = "have a clear approval."] + #[doc = ""] + #[doc = "Any bid deposit is lost and voucher is banned."] pub fn kick_candidate( &self, candidate: types::kick_candidate::Candidate, @@ -18001,7 +19937,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::resign_candidacy`]."] + #[doc = "Remove the candidate's application from the society. Callable only by the candidate."] + #[doc = ""] + #[doc = "Any bid deposit is lost and voucher is banned."] pub fn resign_candidacy(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Society", @@ -18015,7 +19953,11 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::drop_candidate`]."] + #[doc = "Remove a `candidate`'s failed application from the society. Callable by any"] + #[doc = "signed origin but only at the end of the subsequent round and only for"] + #[doc = "a candidate with more rejections than approvals."] + #[doc = ""] + #[doc = "The bid deposit is lost and the voucher is banned."] pub fn drop_candidate( &self, candidate: types::drop_candidate::Candidate, @@ -18031,7 +19973,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::cleanup_candidacy`]."] + #[doc = "Remove up to `max` stale votes for the given `candidate`."] + #[doc = ""] + #[doc = "May be called by any Signed origin, but only after the candidate's candidacy is ended."] pub fn cleanup_candidacy( &self, candidate: types::cleanup_candidacy::Candidate, @@ -18049,7 +19993,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::cleanup_challenge`]."] + #[doc = "Remove up to `max` stale votes for the defender in the given `challenge_round`."] + #[doc = ""] + #[doc = "May be called by any Signed origin, but only after the challenge round is ended."] pub fn cleanup_challenge( &self, challenge_round: types::cleanup_challenge::ChallengeRound, @@ -18599,7 +20545,7 @@ pub mod api { pub fn parameters( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::parameters::Parameters, ::subxt::storage::address::Yes, (), @@ -18608,7 +20554,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Parameters", - vec![], + (), [ 69u8, 147u8, 95u8, 26u8, 245u8, 207u8, 83u8, 57u8, 229u8, 34u8, 205u8, 202u8, 182u8, 180u8, 219u8, 86u8, 152u8, 140u8, 212u8, 145u8, 7u8, @@ -18621,7 +20567,7 @@ pub mod api { pub fn pot( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::pot::Pot, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -18630,7 +20576,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Pot", - vec![], + (), [ 98u8, 77u8, 215u8, 220u8, 51u8, 87u8, 188u8, 65u8, 72u8, 231u8, 34u8, 161u8, 61u8, 59u8, 66u8, 105u8, 128u8, 23u8, 249u8, 27u8, 10u8, 0u8, @@ -18642,7 +20588,7 @@ pub mod api { pub fn founder( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::founder::Founder, ::subxt::storage::address::Yes, (), @@ -18651,7 +20597,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Founder", - vec![], + (), [ 14u8, 6u8, 181u8, 186u8, 64u8, 213u8, 48u8, 110u8, 242u8, 50u8, 144u8, 77u8, 38u8, 127u8, 161u8, 54u8, 204u8, 119u8, 1u8, 218u8, 12u8, 57u8, @@ -18663,7 +20609,7 @@ pub mod api { pub fn head( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::head::Head, ::subxt::storage::address::Yes, (), @@ -18672,7 +20618,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Head", - vec![], + (), [ 95u8, 2u8, 23u8, 237u8, 130u8, 169u8, 84u8, 51u8, 1u8, 178u8, 234u8, 194u8, 139u8, 35u8, 222u8, 150u8, 246u8, 176u8, 97u8, 103u8, 211u8, @@ -18685,7 +20631,7 @@ pub mod api { pub fn rules( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::rules::Rules, ::subxt::storage::address::Yes, (), @@ -18694,7 +20640,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Rules", - vec![], + (), [ 119u8, 249u8, 119u8, 89u8, 243u8, 239u8, 149u8, 15u8, 238u8, 40u8, 172u8, 198u8, 24u8, 107u8, 57u8, 39u8, 155u8, 36u8, 13u8, 72u8, 153u8, @@ -18707,7 +20653,7 @@ pub mod api { pub fn members_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::members::Members, (), (), @@ -18716,7 +20662,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Members", - vec![], + (), [ 207u8, 227u8, 130u8, 247u8, 29u8, 198u8, 129u8, 83u8, 3u8, 6u8, 19u8, 37u8, 163u8, 227u8, 0u8, 94u8, 8u8, 166u8, 111u8, 70u8, 101u8, 65u8, @@ -18729,7 +20675,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::members::Members, ::subxt::storage::address::Yes, (), @@ -18738,9 +20684,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Members", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 207u8, 227u8, 130u8, 247u8, 29u8, 198u8, 129u8, 83u8, 3u8, 6u8, 19u8, 37u8, 163u8, 227u8, 0u8, 94u8, 8u8, 166u8, 111u8, 70u8, 101u8, 65u8, @@ -18752,7 +20696,7 @@ pub mod api { pub fn payouts_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::payouts::Payouts, (), ::subxt::storage::address::Yes, @@ -18761,7 +20705,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Payouts", - vec![], + (), [ 251u8, 249u8, 170u8, 219u8, 131u8, 113u8, 178u8, 165u8, 173u8, 36u8, 175u8, 199u8, 57u8, 188u8, 59u8, 226u8, 4u8, 45u8, 36u8, 173u8, 113u8, @@ -18774,7 +20718,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::payouts::Payouts, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -18783,9 +20727,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Payouts", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 251u8, 249u8, 170u8, 219u8, 131u8, 113u8, 178u8, 165u8, 173u8, 36u8, 175u8, 199u8, 57u8, 188u8, 59u8, 226u8, 4u8, 45u8, 36u8, 173u8, 113u8, @@ -18797,7 +20739,7 @@ pub mod api { pub fn member_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::member_count::MemberCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -18806,7 +20748,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "MemberCount", - vec![], + (), [ 251u8, 200u8, 97u8, 38u8, 125u8, 162u8, 19u8, 100u8, 249u8, 254u8, 42u8, 93u8, 64u8, 171u8, 2u8, 200u8, 129u8, 228u8, 211u8, 229u8, 152u8, @@ -18820,7 +20762,7 @@ pub mod api { pub fn member_by_index_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::member_by_index::MemberByIndex, (), (), @@ -18829,7 +20771,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "MemberByIndex", - vec![], + (), [ 13u8, 233u8, 212u8, 149u8, 220u8, 158u8, 17u8, 27u8, 201u8, 61u8, 202u8, 248u8, 192u8, 37u8, 199u8, 73u8, 32u8, 140u8, 204u8, 206u8, @@ -18844,7 +20786,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::member_by_index::MemberByIndex, ::subxt::storage::address::Yes, (), @@ -18853,9 +20795,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "MemberByIndex", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 13u8, 233u8, 212u8, 149u8, 220u8, 158u8, 17u8, 27u8, 201u8, 61u8, 202u8, 248u8, 192u8, 37u8, 199u8, 73u8, 32u8, 140u8, 204u8, 206u8, @@ -18868,7 +20808,7 @@ pub mod api { pub fn suspended_members_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::suspended_members::SuspendedMembers, (), (), @@ -18877,7 +20817,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "SuspendedMembers", - vec![], + (), [ 156u8, 11u8, 75u8, 79u8, 74u8, 79u8, 98u8, 89u8, 63u8, 83u8, 84u8, 249u8, 177u8, 227u8, 113u8, 21u8, 26u8, 165u8, 129u8, 5u8, 129u8, @@ -18891,7 +20831,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::suspended_members::SuspendedMembers, ::subxt::storage::address::Yes, (), @@ -18900,9 +20840,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "SuspendedMembers", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 156u8, 11u8, 75u8, 79u8, 74u8, 79u8, 98u8, 89u8, 63u8, 83u8, 84u8, 249u8, 177u8, 227u8, 113u8, 21u8, 26u8, 165u8, 129u8, 5u8, 129u8, @@ -18915,7 +20853,7 @@ pub mod api { pub fn round_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::round_count::RoundCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -18924,7 +20862,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "RoundCount", - vec![], + (), [ 61u8, 189u8, 115u8, 157u8, 36u8, 97u8, 192u8, 96u8, 138u8, 168u8, 222u8, 58u8, 117u8, 199u8, 176u8, 146u8, 232u8, 167u8, 52u8, 190u8, @@ -18937,7 +20875,7 @@ pub mod api { pub fn bids( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::bids::Bids, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -18946,7 +20884,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Bids", - vec![], + (), [ 220u8, 159u8, 208u8, 176u8, 118u8, 11u8, 21u8, 34u8, 3u8, 101u8, 233u8, 212u8, 149u8, 156u8, 235u8, 135u8, 142u8, 220u8, 76u8, 99u8, 60u8, @@ -18957,7 +20895,7 @@ pub mod api { pub fn candidates_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::candidates::Candidates, (), (), @@ -18966,7 +20904,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Candidates", - vec![], + (), [ 52u8, 250u8, 201u8, 163u8, 0u8, 5u8, 156u8, 84u8, 96u8, 130u8, 228u8, 205u8, 34u8, 75u8, 121u8, 209u8, 82u8, 15u8, 247u8, 21u8, 54u8, 177u8, @@ -18978,7 +20916,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::candidates::Candidates, ::subxt::storage::address::Yes, (), @@ -18987,9 +20925,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Candidates", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 52u8, 250u8, 201u8, 163u8, 0u8, 5u8, 156u8, 84u8, 96u8, 130u8, 228u8, 205u8, 34u8, 75u8, 121u8, 209u8, 82u8, 15u8, 247u8, 21u8, 54u8, 177u8, @@ -19001,7 +20937,7 @@ pub mod api { pub fn skeptic( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::skeptic::Skeptic, ::subxt::storage::address::Yes, (), @@ -19010,7 +20946,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Skeptic", - vec![], + (), [ 121u8, 103u8, 195u8, 11u8, 87u8, 129u8, 61u8, 69u8, 218u8, 17u8, 101u8, 207u8, 249u8, 207u8, 18u8, 103u8, 253u8, 240u8, 132u8, 46u8, 47u8, @@ -19023,7 +20959,7 @@ pub mod api { pub fn votes_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::votes::Votes, (), (), @@ -19032,7 +20968,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Votes", - vec![], + (), [ 34u8, 201u8, 151u8, 130u8, 149u8, 159u8, 32u8, 201u8, 127u8, 178u8, 77u8, 214u8, 73u8, 158u8, 11u8, 247u8, 188u8, 156u8, 146u8, 59u8, @@ -19046,7 +20982,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::votes::Votes, (), (), @@ -19055,9 +20991,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Votes", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 34u8, 201u8, 151u8, 130u8, 149u8, 159u8, 32u8, 201u8, 127u8, 178u8, 77u8, 214u8, 73u8, 158u8, 11u8, 247u8, 188u8, 156u8, 146u8, 59u8, @@ -19072,7 +21006,10 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey, + ::subxt::storage::address::StaticStorageKey, + ), types::votes::Votes, ::subxt::storage::address::Yes, (), @@ -19081,10 +21018,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Votes", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 34u8, 201u8, 151u8, 130u8, 149u8, 159u8, 32u8, 201u8, 127u8, 178u8, 77u8, 214u8, 73u8, 158u8, 11u8, 247u8, 188u8, 156u8, 146u8, 59u8, @@ -19097,7 +21034,7 @@ pub mod api { pub fn vote_clear_cursor_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::vote_clear_cursor::VoteClearCursor, (), (), @@ -19106,7 +21043,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "VoteClearCursor", - vec![], + (), [ 157u8, 200u8, 216u8, 228u8, 235u8, 144u8, 13u8, 111u8, 252u8, 213u8, 209u8, 114u8, 157u8, 159u8, 47u8, 125u8, 45u8, 152u8, 27u8, 145u8, @@ -19120,7 +21057,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::vote_clear_cursor::VoteClearCursor, ::subxt::storage::address::Yes, (), @@ -19129,9 +21066,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "VoteClearCursor", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 157u8, 200u8, 216u8, 228u8, 235u8, 144u8, 13u8, 111u8, 252u8, 213u8, 209u8, 114u8, 157u8, 159u8, 47u8, 125u8, 45u8, 152u8, 27u8, 145u8, @@ -19146,7 +21081,7 @@ pub mod api { pub fn next_head( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::next_head::NextHead, ::subxt::storage::address::Yes, (), @@ -19155,7 +21090,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "NextHead", - vec![], + (), [ 64u8, 118u8, 253u8, 247u8, 56u8, 39u8, 156u8, 38u8, 150u8, 234u8, 190u8, 11u8, 45u8, 236u8, 15u8, 181u8, 6u8, 165u8, 226u8, 99u8, 46u8, @@ -19167,7 +21102,7 @@ pub mod api { pub fn challenge_round_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::challenge_round_count::ChallengeRoundCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -19176,7 +21111,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "ChallengeRoundCount", - vec![], + (), [ 111u8, 74u8, 218u8, 126u8, 43u8, 20u8, 75u8, 119u8, 166u8, 4u8, 56u8, 24u8, 206u8, 10u8, 236u8, 17u8, 62u8, 124u8, 129u8, 39u8, 197u8, 157u8, @@ -19188,7 +21123,7 @@ pub mod api { pub fn defending( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::defending::Defending, ::subxt::storage::address::Yes, (), @@ -19197,7 +21132,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "Defending", - vec![], + (), [ 22u8, 165u8, 42u8, 82u8, 129u8, 214u8, 77u8, 50u8, 110u8, 35u8, 16u8, 44u8, 222u8, 47u8, 238u8, 209u8, 171u8, 254u8, 208u8, 3u8, 2u8, 87u8, @@ -19209,7 +21144,7 @@ pub mod api { pub fn defender_votes_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::defender_votes::DefenderVotes, (), (), @@ -19218,7 +21153,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "DefenderVotes", - vec![], + (), [ 208u8, 137u8, 138u8, 215u8, 215u8, 207u8, 236u8, 140u8, 175u8, 50u8, 110u8, 228u8, 48u8, 174u8, 16u8, 59u8, 72u8, 108u8, 7u8, 183u8, 119u8, @@ -19232,7 +21167,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::defender_votes::DefenderVotes, (), (), @@ -19241,9 +21176,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "DefenderVotes", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 208u8, 137u8, 138u8, 215u8, 215u8, 207u8, 236u8, 140u8, 175u8, 50u8, 110u8, 228u8, 48u8, 174u8, 16u8, 59u8, 72u8, 108u8, 7u8, 183u8, 119u8, @@ -19258,7 +21191,10 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey, + ::subxt::storage::address::StaticStorageKey, + ), types::defender_votes::DefenderVotes, ::subxt::storage::address::Yes, (), @@ -19267,10 +21203,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Society", "DefenderVotes", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 208u8, 137u8, 138u8, 215u8, 215u8, 207u8, 236u8, 140u8, 175u8, 50u8, 110u8, 228u8, 48u8, 174u8, 16u8, 59u8, 72u8, 108u8, 7u8, 183u8, 119u8, @@ -19435,7 +21371,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::as_recovered`]."] + #[doc = "Send a call through a recovered account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and registered to"] + #[doc = "be able to make calls on behalf of the recovered account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `account`: The recovered account you want to make a call on-behalf-of."] + #[doc = "- `call`: The call you want to make with the recovered account."] pub struct AsRecovered { pub account: as_recovered::Account, pub call: ::std::boxed::Box, @@ -19460,7 +21403,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_recovered`]."] + #[doc = "Allow ROOT to bypass the recovery process and set an a rescuer account"] + #[doc = "for a lost account directly."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _ROOT_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `lost`: The \"lost account\" to be recovered."] + #[doc = "- `rescuer`: The \"rescuer account\" which can call as the lost account."] pub struct SetRecovered { pub lost: set_recovered::Lost, pub rescuer: set_recovered::Rescuer, @@ -19485,7 +21435,22 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::create_recovery`]."] + #[doc = "Create a recovery configuration for your account. This makes your account recoverable."] + #[doc = ""] + #[doc = "Payment: `ConfigDepositBase` + `FriendDepositFactor` * #_of_friends balance"] + #[doc = "will be reserved for storing the recovery configuration. This deposit is returned"] + #[doc = "in full when the user calls `remove_recovery`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `friends`: A list of friends you trust to vouch for recovery attempts. Should be"] + #[doc = " ordered and contain no duplicate values."] + #[doc = "- `threshold`: The number of friends that must vouch for a recovery attempt before the"] + #[doc = " account can be recovered. Should be less than or equal to the length of the list of"] + #[doc = " friends."] + #[doc = "- `delay_period`: The number of blocks after a recovery attempt is initialized that"] + #[doc = " needs to pass before the account can be recovered."] pub struct CreateRecovery { pub friends: create_recovery::Friends, pub threshold: create_recovery::Threshold, @@ -19511,7 +21476,17 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::initiate_recovery`]."] + #[doc = "Initiate the process for recovering a recoverable account."] + #[doc = ""] + #[doc = "Payment: `RecoveryDeposit` balance will be reserved for initiating the"] + #[doc = "recovery process. This deposit will always be repatriated to the account"] + #[doc = "trying to be recovered. See `close_recovery`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `account`: The lost account that you want to recover. This account needs to be"] + #[doc = " recoverable (i.e. have a recovery configuration)."] pub struct InitiateRecovery { pub account: initiate_recovery::Account, } @@ -19534,7 +21509,18 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::vouch_recovery`]."] + #[doc = "Allow a \"friend\" of a recoverable account to vouch for an active recovery"] + #[doc = "process for that account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and must be a \"friend\""] + #[doc = "for the recoverable account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `lost`: The lost account that you want to recover."] + #[doc = "- `rescuer`: The account trying to rescue the lost account that you want to vouch for."] + #[doc = ""] + #[doc = "The combination of these two parameters must point to an active recovery"] + #[doc = "process."] pub struct VouchRecovery { pub lost: vouch_recovery::Lost, pub rescuer: vouch_recovery::Rescuer, @@ -19559,7 +21545,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::claim_recovery`]."] + #[doc = "Allow a successful rescuer to claim their recovered account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and must be a \"rescuer\""] + #[doc = "who has successfully completed the account recovery process: collected"] + #[doc = "`threshold` or more vouches, waited `delay_period` blocks since initiation."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `account`: The lost account that you want to claim has been successfully recovered by"] + #[doc = " you."] pub struct ClaimRecovery { pub account: claim_recovery::Account, } @@ -19582,7 +21576,17 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::close_recovery`]."] + #[doc = "As the controller of a recoverable account, close an active recovery"] + #[doc = "process for your account."] + #[doc = ""] + #[doc = "Payment: By calling this function, the recoverable account will receive"] + #[doc = "the recovery deposit `RecoveryDeposit` placed by the rescuer."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and must be a"] + #[doc = "recoverable account with an active recovery process for it."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `rescuer`: The account trying to rescue this recoverable account."] pub struct CloseRecovery { pub rescuer: close_recovery::Rescuer, } @@ -19605,7 +21609,17 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove_recovery`]."] + #[doc = "Remove the recovery process for your account. Recovered accounts are still accessible."] + #[doc = ""] + #[doc = "NOTE: The user must make sure to call `close_recovery` on all active"] + #[doc = "recovery attempts before calling this function else it will fail."] + #[doc = ""] + #[doc = "Payment: By calling this function the recoverable account will unreserve"] + #[doc = "their recovery configuration deposit."] + #[doc = "(`ConfigDepositBase` + `FriendDepositFactor` * #_of_friends)"] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and must be a"] + #[doc = "recoverable account (i.e. has a recovery configuration)."] pub struct RemoveRecovery; impl ::subxt::blocks::StaticExtrinsic for RemoveRecovery { const PALLET: &'static str = "Recovery"; @@ -19621,7 +21635,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::cancel_recovered`]."] + #[doc = "Cancel the ability to use `as_recovered` for `account`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and registered to"] + #[doc = "be able to make calls on behalf of the recovered account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `account`: The recovered account you are able to call on-behalf-of."] pub struct CancelRecovered { pub account: cancel_recovered::Account, } @@ -19637,7 +21657,14 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::as_recovered`]."] + #[doc = "Send a call through a recovered account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and registered to"] + #[doc = "be able to make calls on behalf of the recovered account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `account`: The recovered account you want to make a call on-behalf-of."] + #[doc = "- `call`: The call you want to make with the recovered account."] pub fn as_recovered( &self, account: types::as_recovered::Account, @@ -19651,13 +21678,21 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 37u8, 58u8, 252u8, 116u8, 228u8, 248u8, 131u8, 216u8, 1u8, 33u8, 213u8, - 41u8, 203u8, 3u8, 225u8, 255u8, 195u8, 8u8, 172u8, 38u8, 249u8, 105u8, - 83u8, 16u8, 13u8, 213u8, 0u8, 91u8, 198u8, 141u8, 6u8, 16u8, + 135u8, 12u8, 48u8, 186u8, 171u8, 82u8, 254u8, 243u8, 245u8, 181u8, + 120u8, 28u8, 237u8, 197u8, 36u8, 204u8, 118u8, 98u8, 112u8, 129u8, + 95u8, 226u8, 68u8, 252u8, 55u8, 72u8, 164u8, 40u8, 121u8, 195u8, 128u8, + 12u8, ], ) } - #[doc = "See [`Pallet::set_recovered`]."] + #[doc = "Allow ROOT to bypass the recovery process and set an a rescuer account"] + #[doc = "for a lost account directly."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _ROOT_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `lost`: The \"lost account\" to be recovered."] + #[doc = "- `rescuer`: The \"rescuer account\" which can call as the lost account."] pub fn set_recovered( &self, lost: types::set_recovered::Lost, @@ -19674,7 +21709,22 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::create_recovery`]."] + #[doc = "Create a recovery configuration for your account. This makes your account recoverable."] + #[doc = ""] + #[doc = "Payment: `ConfigDepositBase` + `FriendDepositFactor` * #_of_friends balance"] + #[doc = "will be reserved for storing the recovery configuration. This deposit is returned"] + #[doc = "in full when the user calls `remove_recovery`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `friends`: A list of friends you trust to vouch for recovery attempts. Should be"] + #[doc = " ordered and contain no duplicate values."] + #[doc = "- `threshold`: The number of friends that must vouch for a recovery attempt before the"] + #[doc = " account can be recovered. Should be less than or equal to the length of the list of"] + #[doc = " friends."] + #[doc = "- `delay_period`: The number of blocks after a recovery attempt is initialized that"] + #[doc = " needs to pass before the account can be recovered."] pub fn create_recovery( &self, friends: types::create_recovery::Friends, @@ -19696,7 +21746,17 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::initiate_recovery`]."] + #[doc = "Initiate the process for recovering a recoverable account."] + #[doc = ""] + #[doc = "Payment: `RecoveryDeposit` balance will be reserved for initiating the"] + #[doc = "recovery process. This deposit will always be repatriated to the account"] + #[doc = "trying to be recovered. See `close_recovery`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `account`: The lost account that you want to recover. This account needs to be"] + #[doc = " recoverable (i.e. have a recovery configuration)."] pub fn initiate_recovery( &self, account: types::initiate_recovery::Account, @@ -19712,7 +21772,18 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::vouch_recovery`]."] + #[doc = "Allow a \"friend\" of a recoverable account to vouch for an active recovery"] + #[doc = "process for that account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and must be a \"friend\""] + #[doc = "for the recoverable account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `lost`: The lost account that you want to recover."] + #[doc = "- `rescuer`: The account trying to rescue the lost account that you want to vouch for."] + #[doc = ""] + #[doc = "The combination of these two parameters must point to an active recovery"] + #[doc = "process."] pub fn vouch_recovery( &self, lost: types::vouch_recovery::Lost, @@ -19729,7 +21800,15 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::claim_recovery`]."] + #[doc = "Allow a successful rescuer to claim their recovered account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and must be a \"rescuer\""] + #[doc = "who has successfully completed the account recovery process: collected"] + #[doc = "`threshold` or more vouches, waited `delay_period` blocks since initiation."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `account`: The lost account that you want to claim has been successfully recovered by"] + #[doc = " you."] pub fn claim_recovery( &self, account: types::claim_recovery::Account, @@ -19746,7 +21825,17 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::close_recovery`]."] + #[doc = "As the controller of a recoverable account, close an active recovery"] + #[doc = "process for your account."] + #[doc = ""] + #[doc = "Payment: By calling this function, the recoverable account will receive"] + #[doc = "the recovery deposit `RecoveryDeposit` placed by the rescuer."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and must be a"] + #[doc = "recoverable account with an active recovery process for it."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `rescuer`: The account trying to rescue this recoverable account."] pub fn close_recovery( &self, rescuer: types::close_recovery::Rescuer, @@ -19763,7 +21852,17 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remove_recovery`]."] + #[doc = "Remove the recovery process for your account. Recovered accounts are still accessible."] + #[doc = ""] + #[doc = "NOTE: The user must make sure to call `close_recovery` on all active"] + #[doc = "recovery attempts before calling this function else it will fail."] + #[doc = ""] + #[doc = "Payment: By calling this function the recoverable account will unreserve"] + #[doc = "their recovery configuration deposit."] + #[doc = "(`ConfigDepositBase` + `FriendDepositFactor` * #_of_friends)"] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and must be a"] + #[doc = "recoverable account (i.e. has a recovery configuration)."] pub fn remove_recovery(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Recovery", @@ -19777,7 +21876,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::cancel_recovered`]."] + #[doc = "Cancel the ability to use `as_recovered` for `account`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and registered to"] + #[doc = "be able to make calls on behalf of the recovered account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `account`: The recovered account you are able to call on-behalf-of."] pub fn cancel_recovered( &self, account: types::cancel_recovered::Account, @@ -19982,7 +22087,7 @@ pub mod api { pub fn recoverable_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::recoverable::Recoverable, (), (), @@ -19991,7 +22096,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Recovery", "Recoverable", - vec![], + (), [ 112u8, 7u8, 56u8, 46u8, 138u8, 197u8, 63u8, 234u8, 140u8, 123u8, 145u8, 106u8, 189u8, 190u8, 247u8, 61u8, 250u8, 67u8, 107u8, 42u8, 170u8, @@ -20004,7 +22109,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::recoverable::Recoverable, ::subxt::storage::address::Yes, (), @@ -20013,9 +22118,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Recovery", "Recoverable", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 112u8, 7u8, 56u8, 46u8, 138u8, 197u8, 63u8, 234u8, 140u8, 123u8, 145u8, 106u8, 189u8, 190u8, 247u8, 61u8, 250u8, 67u8, 107u8, 42u8, 170u8, @@ -20030,7 +22133,7 @@ pub mod api { pub fn active_recoveries_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::active_recoveries::ActiveRecoveries, (), (), @@ -20039,7 +22142,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Recovery", "ActiveRecoveries", - vec![], + (), [ 104u8, 252u8, 28u8, 142u8, 48u8, 26u8, 91u8, 201u8, 184u8, 163u8, 180u8, 197u8, 189u8, 71u8, 144u8, 88u8, 225u8, 13u8, 183u8, 84u8, @@ -20056,7 +22159,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::active_recoveries::ActiveRecoveries, (), (), @@ -20065,9 +22168,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Recovery", "ActiveRecoveries", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 104u8, 252u8, 28u8, 142u8, 48u8, 26u8, 91u8, 201u8, 184u8, 163u8, 180u8, 197u8, 189u8, 71u8, 144u8, 88u8, 225u8, 13u8, 183u8, 84u8, @@ -20085,7 +22186,14 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey< + types::active_recoveries::Param0, + >, + ::subxt::storage::address::StaticStorageKey< + types::active_recoveries::Param1, + >, + ), types::active_recoveries::ActiveRecoveries, ::subxt::storage::address::Yes, (), @@ -20094,10 +22202,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Recovery", "ActiveRecoveries", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 104u8, 252u8, 28u8, 142u8, 48u8, 26u8, 91u8, 201u8, 184u8, 163u8, 180u8, 197u8, 189u8, 71u8, 144u8, 88u8, 225u8, 13u8, 183u8, 84u8, @@ -20112,7 +22220,7 @@ pub mod api { pub fn proxy_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::proxy::Proxy, (), (), @@ -20121,7 +22229,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Recovery", "Proxy", - vec![], + (), [ 161u8, 242u8, 17u8, 183u8, 161u8, 47u8, 87u8, 110u8, 201u8, 177u8, 199u8, 157u8, 30u8, 131u8, 49u8, 89u8, 182u8, 86u8, 152u8, 19u8, 199u8, @@ -20136,7 +22244,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::proxy::Proxy, ::subxt::storage::address::Yes, (), @@ -20145,9 +22253,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Recovery", "Proxy", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 161u8, 242u8, 17u8, 183u8, 161u8, 47u8, 87u8, 110u8, 201u8, 177u8, 199u8, 157u8, 30u8, 131u8, 49u8, 89u8, 182u8, 86u8, 152u8, 19u8, 199u8, @@ -20260,7 +22366,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::vest`]."] + #[doc = "Unlock any vested funds of the sender account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have funds still"] + #[doc = "locked under this pallet."] + #[doc = ""] + #[doc = "Emits either `VestingCompleted` or `VestingUpdated`."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub struct Vest; impl ::subxt::blocks::StaticExtrinsic for Vest { const PALLET: &'static str = "Vesting"; @@ -20276,7 +22390,17 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::vest_other`]."] + #[doc = "Unlock any vested funds of a `target` account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `target`: The account whose vested funds should be unlocked. Must have funds still"] + #[doc = "locked under this pallet."] + #[doc = ""] + #[doc = "Emits either `VestingCompleted` or `VestingUpdated`."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub struct VestOther { pub target: vest_other::Target, } @@ -20298,7 +22422,19 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::vested_transfer`]."] + #[doc = "Create a vested transfer."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `target`: The account receiving the vested funds."] + #[doc = "- `schedule`: The vesting schedule attached to the transfer."] + #[doc = ""] + #[doc = "Emits `VestingCreated`."] + #[doc = ""] + #[doc = "NOTE: This will unlock all schedules through the current block."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub struct VestedTransfer { pub target: vested_transfer::Target, pub schedule: vested_transfer::Schedule, @@ -20325,7 +22461,20 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_vested_transfer`]."] + #[doc = "Force a vested transfer."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] + #[doc = ""] + #[doc = "- `source`: The account whose funds should be transferred."] + #[doc = "- `target`: The account that should be transferred the vested funds."] + #[doc = "- `schedule`: The vesting schedule attached to the transfer."] + #[doc = ""] + #[doc = "Emits `VestingCreated`."] + #[doc = ""] + #[doc = "NOTE: This will unlock all schedules through the current block."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub struct ForceVestedTransfer { pub source: force_vested_transfer::Source, pub target: force_vested_transfer::Target, @@ -20354,7 +22503,27 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::merge_schedules`]."] + #[doc = "Merge two vesting schedules together, creating a new vesting schedule that unlocks over"] + #[doc = "the highest possible start and end blocks. If both schedules have already started the"] + #[doc = "current block will be used as the schedule start; with the caveat that if one schedule"] + #[doc = "is finished by the current block, the other will be treated as the new merged schedule,"] + #[doc = "unmodified."] + #[doc = ""] + #[doc = "NOTE: If `schedule1_index == schedule2_index` this is a no-op."] + #[doc = "NOTE: This will unlock all schedules through the current block prior to merging."] + #[doc = "NOTE: If both schedules have ended by the current block, no new schedule will be created"] + #[doc = "and both will be removed."] + #[doc = ""] + #[doc = "Merged schedule attributes:"] + #[doc = "- `starting_block`: `MAX(schedule1.starting_block, scheduled2.starting_block,"] + #[doc = " current_block)`."] + #[doc = "- `ending_block`: `MAX(schedule1.ending_block, schedule2.ending_block)`."] + #[doc = "- `locked`: `schedule1.locked_at(current_block) + schedule2.locked_at(current_block)`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `schedule1_index`: index of the first schedule to merge."] + #[doc = "- `schedule2_index`: index of the second schedule to merge."] pub struct MergeSchedules { pub schedule1_index: merge_schedules::Schedule1Index, pub schedule2_index: merge_schedules::Schedule2Index, @@ -20378,7 +22547,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_remove_vesting_schedule`]."] + #[doc = "Force remove a vesting schedule"] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] + #[doc = ""] + #[doc = "- `target`: An account that has a vesting schedule"] + #[doc = "- `schedule_index`: The vesting schedule index that should be removed"] pub struct ForceRemoveVestingSchedule { pub target: force_remove_vesting_schedule::Target, pub schedule_index: force_remove_vesting_schedule::ScheduleIndex, @@ -20395,7 +22569,15 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::vest`]."] + #[doc = "Unlock any vested funds of the sender account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have funds still"] + #[doc = "locked under this pallet."] + #[doc = ""] + #[doc = "Emits either `VestingCompleted` or `VestingUpdated`."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub fn vest(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Vesting", @@ -20409,7 +22591,17 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::vest_other`]."] + #[doc = "Unlock any vested funds of a `target` account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `target`: The account whose vested funds should be unlocked. Must have funds still"] + #[doc = "locked under this pallet."] + #[doc = ""] + #[doc = "Emits either `VestingCompleted` or `VestingUpdated`."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub fn vest_other( &self, target: types::vest_other::Target, @@ -20425,7 +22617,19 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::vested_transfer`]."] + #[doc = "Create a vested transfer."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `target`: The account receiving the vested funds."] + #[doc = "- `schedule`: The vesting schedule attached to the transfer."] + #[doc = ""] + #[doc = "Emits `VestingCreated`."] + #[doc = ""] + #[doc = "NOTE: This will unlock all schedules through the current block."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub fn vested_transfer( &self, target: types::vested_transfer::Target, @@ -20442,7 +22646,20 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_vested_transfer`]."] + #[doc = "Force a vested transfer."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] + #[doc = ""] + #[doc = "- `source`: The account whose funds should be transferred."] + #[doc = "- `target`: The account that should be transferred the vested funds."] + #[doc = "- `schedule`: The vesting schedule attached to the transfer."] + #[doc = ""] + #[doc = "Emits `VestingCreated`."] + #[doc = ""] + #[doc = "NOTE: This will unlock all schedules through the current block."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] pub fn force_vested_transfer( &self, source: types::force_vested_transfer::Source, @@ -20465,7 +22682,27 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::merge_schedules`]."] + #[doc = "Merge two vesting schedules together, creating a new vesting schedule that unlocks over"] + #[doc = "the highest possible start and end blocks. If both schedules have already started the"] + #[doc = "current block will be used as the schedule start; with the caveat that if one schedule"] + #[doc = "is finished by the current block, the other will be treated as the new merged schedule,"] + #[doc = "unmodified."] + #[doc = ""] + #[doc = "NOTE: If `schedule1_index == schedule2_index` this is a no-op."] + #[doc = "NOTE: This will unlock all schedules through the current block prior to merging."] + #[doc = "NOTE: If both schedules have ended by the current block, no new schedule will be created"] + #[doc = "and both will be removed."] + #[doc = ""] + #[doc = "Merged schedule attributes:"] + #[doc = "- `starting_block`: `MAX(schedule1.starting_block, scheduled2.starting_block,"] + #[doc = " current_block)`."] + #[doc = "- `ending_block`: `MAX(schedule1.ending_block, schedule2.ending_block)`."] + #[doc = "- `locked`: `schedule1.locked_at(current_block) + schedule2.locked_at(current_block)`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `schedule1_index`: index of the first schedule to merge."] + #[doc = "- `schedule2_index`: index of the second schedule to merge."] pub fn merge_schedules( &self, schedule1_index: types::merge_schedules::Schedule1Index, @@ -20485,7 +22722,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_remove_vesting_schedule`]."] + #[doc = "Force remove a vesting schedule"] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] + #[doc = ""] + #[doc = "- `target`: An account that has a vesting schedule"] + #[doc = "- `schedule_index`: The vesting schedule index that should be removed"] pub fn force_remove_vesting_schedule( &self, target: types::force_remove_vesting_schedule::Target, @@ -20584,7 +22826,7 @@ pub mod api { pub fn vesting_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::vesting::Vesting, (), (), @@ -20593,7 +22835,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Vesting", "Vesting", - vec![], + (), [ 95u8, 168u8, 217u8, 248u8, 149u8, 86u8, 195u8, 93u8, 73u8, 206u8, 105u8, 165u8, 33u8, 173u8, 232u8, 81u8, 147u8, 254u8, 50u8, 228u8, @@ -20607,7 +22849,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::vesting::Vesting, ::subxt::storage::address::Yes, (), @@ -20616,9 +22858,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Vesting", "Vesting", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 95u8, 168u8, 217u8, 248u8, 149u8, 86u8, 195u8, 93u8, 73u8, 206u8, 105u8, 165u8, 33u8, 173u8, 232u8, 81u8, 147u8, 254u8, 50u8, 228u8, @@ -20633,7 +22873,7 @@ pub mod api { pub fn storage_version( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::storage_version::StorageVersion, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -20642,7 +22882,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Vesting", "StorageVersion", - vec![], + (), [ 230u8, 137u8, 180u8, 133u8, 142u8, 124u8, 231u8, 234u8, 223u8, 10u8, 154u8, 98u8, 158u8, 253u8, 228u8, 80u8, 5u8, 9u8, 91u8, 210u8, 252u8, @@ -20710,7 +22950,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::schedule`]."] + #[doc = "Anonymously schedule a task."] pub struct Schedule { pub when: schedule::When, pub maybe_periodic: schedule::MaybePeriodic, @@ -20739,7 +22979,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::cancel`]."] + #[doc = "Cancel an anonymously scheduled task."] pub struct Cancel { pub when: cancel::When, pub index: cancel::Index, @@ -20763,7 +23003,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::schedule_named`]."] + #[doc = "Schedule a named task."] pub struct ScheduleNamed { pub id: schedule_named::Id, pub when: schedule_named::When, @@ -20794,7 +23034,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::cancel_named`]."] + #[doc = "Cancel a named scheduled task."] pub struct CancelNamed { pub id: cancel_named::Id, } @@ -20816,7 +23056,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::schedule_after`]."] + #[doc = "Anonymously schedule a task after a delay."] pub struct ScheduleAfter { pub after: schedule_after::After, pub maybe_periodic: schedule_after::MaybePeriodic, @@ -20845,7 +23085,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::schedule_named_after`]."] + #[doc = "Schedule a named task after a delay."] pub struct ScheduleNamedAfter { pub id: schedule_named_after::Id, pub after: schedule_named_after::After, @@ -20876,7 +23116,18 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_retry`]."] + #[doc = "Set a retry configuration for a task so that, in case its scheduled run fails, it will"] + #[doc = "be retried after `period` blocks, for a total amount of `retries` retries or until it"] + #[doc = "succeeds."] + #[doc = ""] + #[doc = "Tasks which need to be scheduled for a retry are still subject to weight metering and"] + #[doc = "agenda space, same as a regular task. If a periodic task fails, it will be scheduled"] + #[doc = "normally while the task is retrying."] + #[doc = ""] + #[doc = "Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic"] + #[doc = "clones of the original task. Their retry configuration will be derived from the"] + #[doc = "original task's configuration, but will have a lower value for `remaining` than the"] + #[doc = "original `total_retries`."] pub struct SetRetry { pub task: set_retry::Task, pub retries: set_retry::Retries, @@ -20902,7 +23153,18 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_retry_named`]."] + #[doc = "Set a retry configuration for a named task so that, in case its scheduled run fails, it"] + #[doc = "will be retried after `period` blocks, for a total amount of `retries` retries or until"] + #[doc = "it succeeds."] + #[doc = ""] + #[doc = "Tasks which need to be scheduled for a retry are still subject to weight metering and"] + #[doc = "agenda space, same as a regular task. If a periodic task fails, it will be scheduled"] + #[doc = "normally while the task is retrying."] + #[doc = ""] + #[doc = "Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic"] + #[doc = "clones of the original task. Their retry configuration will be derived from the"] + #[doc = "original task's configuration, but will have a lower value for `remaining` than the"] + #[doc = "original `total_retries`."] pub struct SetRetryNamed { pub id: set_retry_named::Id, pub retries: set_retry_named::Retries, @@ -20928,7 +23190,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::cancel_retry`]."] + #[doc = "Removes the retry configuration of a task."] pub struct CancelRetry { pub task: cancel_retry::Task, } @@ -20950,7 +23212,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::cancel_retry_named`]."] + #[doc = "Cancel the retry configuration of a named task."] pub struct CancelRetryNamed { pub id: cancel_retry_named::Id, } @@ -20965,7 +23227,7 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::schedule`]."] + #[doc = "Anonymously schedule a task."] pub fn schedule( &self, when: types::schedule::When, @@ -20983,13 +23245,14 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 138u8, 196u8, 26u8, 129u8, 131u8, 51u8, 78u8, 112u8, 92u8, 174u8, 12u8, - 239u8, 185u8, 165u8, 26u8, 20u8, 222u8, 255u8, 172u8, 151u8, 217u8, - 62u8, 14u8, 102u8, 128u8, 147u8, 143u8, 226u8, 72u8, 62u8, 155u8, 68u8, + 177u8, 175u8, 49u8, 206u8, 0u8, 101u8, 223u8, 105u8, 237u8, 222u8, + 54u8, 201u8, 142u8, 85u8, 208u8, 239u8, 149u8, 209u8, 97u8, 72u8, + 126u8, 225u8, 10u8, 235u8, 26u8, 223u8, 197u8, 153u8, 19u8, 254u8, + 251u8, 181u8, ], ) } - #[doc = "See [`Pallet::cancel`]."] + #[doc = "Cancel an anonymously scheduled task."] pub fn cancel( &self, when: types::cancel::When, @@ -21007,7 +23270,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::schedule_named`]."] + #[doc = "Schedule a named task."] pub fn schedule_named( &self, id: types::schedule_named::Id, @@ -21027,14 +23290,13 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 208u8, 81u8, 95u8, 195u8, 171u8, 238u8, 152u8, 17u8, 86u8, 72u8, 242u8, - 225u8, 129u8, 96u8, 255u8, 181u8, 233u8, 51u8, 174u8, 78u8, 111u8, - 251u8, 244u8, 84u8, 217u8, 223u8, 155u8, 119u8, 167u8, 221u8, 65u8, - 5u8, + 164u8, 136u8, 103u8, 178u8, 45u8, 181u8, 133u8, 195u8, 92u8, 93u8, + 198u8, 193u8, 65u8, 15u8, 156u8, 206u8, 69u8, 50u8, 50u8, 34u8, 150u8, + 94u8, 181u8, 111u8, 219u8, 127u8, 86u8, 122u8, 36u8, 186u8, 21u8, 35u8, ], ) } - #[doc = "See [`Pallet::cancel_named`]."] + #[doc = "Cancel a named scheduled task."] pub fn cancel_named( &self, id: types::cancel_named::Id, @@ -21050,7 +23312,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::schedule_after`]."] + #[doc = "Anonymously schedule a task after a delay."] pub fn schedule_after( &self, after: types::schedule_after::After, @@ -21068,14 +23330,14 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 217u8, 111u8, 46u8, 195u8, 219u8, 234u8, 12u8, 95u8, 253u8, 237u8, - 76u8, 172u8, 88u8, 168u8, 167u8, 165u8, 199u8, 170u8, 207u8, 233u8, - 239u8, 33u8, 251u8, 30u8, 242u8, 210u8, 130u8, 254u8, 129u8, 30u8, - 186u8, 40u8, + 236u8, 195u8, 150u8, 165u8, 194u8, 42u8, 187u8, 43u8, 80u8, 229u8, + 221u8, 146u8, 56u8, 125u8, 199u8, 212u8, 10u8, 2u8, 2u8, 207u8, 195u8, + 54u8, 38u8, 59u8, 193u8, 239u8, 195u8, 150u8, 161u8, 29u8, 113u8, + 225u8, ], ) } - #[doc = "See [`Pallet::schedule_named_after`]."] + #[doc = "Schedule a named task after a delay."] pub fn schedule_named_after( &self, id: types::schedule_named_after::Id, @@ -21095,13 +23357,25 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 79u8, 253u8, 17u8, 220u8, 97u8, 235u8, 221u8, 156u8, 35u8, 51u8, 19u8, - 230u8, 126u8, 42u8, 51u8, 92u8, 171u8, 168u8, 67u8, 13u8, 63u8, 185u8, - 58u8, 30u8, 7u8, 171u8, 53u8, 144u8, 156u8, 255u8, 237u8, 19u8, + 28u8, 81u8, 177u8, 155u8, 39u8, 10u8, 188u8, 144u8, 52u8, 208u8, 6u8, + 205u8, 122u8, 255u8, 38u8, 105u8, 171u8, 234u8, 58u8, 224u8, 86u8, + 188u8, 53u8, 177u8, 113u8, 155u8, 54u8, 237u8, 214u8, 10u8, 140u8, + 245u8, ], ) } - #[doc = "See [`Pallet::set_retry`]."] + #[doc = "Set a retry configuration for a task so that, in case its scheduled run fails, it will"] + #[doc = "be retried after `period` blocks, for a total amount of `retries` retries or until it"] + #[doc = "succeeds."] + #[doc = ""] + #[doc = "Tasks which need to be scheduled for a retry are still subject to weight metering and"] + #[doc = "agenda space, same as a regular task. If a periodic task fails, it will be scheduled"] + #[doc = "normally while the task is retrying."] + #[doc = ""] + #[doc = "Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic"] + #[doc = "clones of the original task. Their retry configuration will be derived from the"] + #[doc = "original task's configuration, but will have a lower value for `remaining` than the"] + #[doc = "original `total_retries`."] pub fn set_retry( &self, task: types::set_retry::Task, @@ -21123,7 +23397,18 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_retry_named`]."] + #[doc = "Set a retry configuration for a named task so that, in case its scheduled run fails, it"] + #[doc = "will be retried after `period` blocks, for a total amount of `retries` retries or until"] + #[doc = "it succeeds."] + #[doc = ""] + #[doc = "Tasks which need to be scheduled for a retry are still subject to weight metering and"] + #[doc = "agenda space, same as a regular task. If a periodic task fails, it will be scheduled"] + #[doc = "normally while the task is retrying."] + #[doc = ""] + #[doc = "Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic"] + #[doc = "clones of the original task. Their retry configuration will be derived from the"] + #[doc = "original task's configuration, but will have a lower value for `remaining` than the"] + #[doc = "original `total_retries`."] pub fn set_retry_named( &self, id: types::set_retry_named::Id, @@ -21146,7 +23431,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::cancel_retry`]."] + #[doc = "Removes the retry configuration of a task."] pub fn cancel_retry( &self, task: types::cancel_retry::Task, @@ -21163,7 +23448,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::cancel_retry_named`]."] + #[doc = "Cancel the retry configuration of a named task."] pub fn cancel_retry_named( &self, id: types::cancel_retry_named::Id, @@ -21454,7 +23739,7 @@ pub mod api { pub fn incomplete_since( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::incomplete_since::IncompleteSince, ::subxt::storage::address::Yes, (), @@ -21463,7 +23748,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Scheduler", "IncompleteSince", - vec![], + (), [ 250u8, 83u8, 64u8, 167u8, 205u8, 59u8, 225u8, 97u8, 205u8, 12u8, 76u8, 130u8, 197u8, 4u8, 111u8, 208u8, 92u8, 217u8, 145u8, 119u8, 38u8, @@ -21475,7 +23760,7 @@ pub mod api { pub fn agenda_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::agenda::Agenda, (), ::subxt::storage::address::Yes, @@ -21484,7 +23769,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Scheduler", "Agenda", - vec![], + (), [ 10u8, 123u8, 252u8, 106u8, 154u8, 9u8, 245u8, 203u8, 188u8, 254u8, 20u8, 41u8, 6u8, 226u8, 78u8, 188u8, 0u8, 173u8, 143u8, 44u8, 117u8, @@ -21497,7 +23782,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::agenda::Agenda, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -21506,9 +23791,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Scheduler", "Agenda", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 10u8, 123u8, 252u8, 106u8, 154u8, 9u8, 245u8, 203u8, 188u8, 254u8, 20u8, 41u8, 6u8, 226u8, 78u8, 188u8, 0u8, 173u8, 143u8, 44u8, 117u8, @@ -21520,7 +23803,7 @@ pub mod api { pub fn retries_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::retries::Retries, (), (), @@ -21529,7 +23812,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Scheduler", "Retries", - vec![], + (), [ 164u8, 27u8, 208u8, 185u8, 19u8, 232u8, 190u8, 97u8, 137u8, 73u8, 146u8, 10u8, 241u8, 176u8, 251u8, 140u8, 133u8, 65u8, 190u8, 162u8, @@ -21543,7 +23826,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::retries::Retries, (), (), @@ -21552,9 +23835,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Scheduler", "Retries", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 164u8, 27u8, 208u8, 185u8, 19u8, 232u8, 190u8, 97u8, 137u8, 73u8, 146u8, 10u8, 241u8, 176u8, 251u8, 140u8, 133u8, 65u8, 190u8, 162u8, @@ -21569,7 +23850,10 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey, + ::subxt::storage::address::StaticStorageKey, + ), types::retries::Retries, ::subxt::storage::address::Yes, (), @@ -21578,10 +23862,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Scheduler", "Retries", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 164u8, 27u8, 208u8, 185u8, 19u8, 232u8, 190u8, 97u8, 137u8, 73u8, 146u8, 10u8, 241u8, 176u8, 251u8, 140u8, 133u8, 65u8, 190u8, 162u8, @@ -21597,7 +23881,7 @@ pub mod api { pub fn lookup_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::lookup::Lookup, (), (), @@ -21606,7 +23890,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Scheduler", "Lookup", - vec![], + (), [ 24u8, 87u8, 96u8, 127u8, 136u8, 205u8, 238u8, 174u8, 71u8, 110u8, 65u8, 98u8, 228u8, 167u8, 99u8, 71u8, 171u8, 186u8, 12u8, 218u8, 137u8, 70u8, @@ -21622,7 +23906,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::lookup::Lookup, ::subxt::storage::address::Yes, (), @@ -21631,9 +23915,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Scheduler", "Lookup", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 24u8, 87u8, 96u8, 127u8, 136u8, 205u8, 238u8, 174u8, 71u8, 110u8, 65u8, 98u8, 228u8, 167u8, 99u8, 71u8, 171u8, 186u8, 12u8, 218u8, 137u8, 70u8, @@ -21708,7 +23990,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::proxy`]."] + #[doc = "Dispatch the given `call` from an account that the sender is authorised for through"] + #[doc = "`add_proxy`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `real`: The account that the proxy will make a call on behalf of."] + #[doc = "- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call."] + #[doc = "- `call`: The call to be made by the `real` account."] pub struct Proxy { pub real: proxy::Real, pub force_proxy_type: proxy::ForceProxyType, @@ -21735,7 +24025,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::add_proxy`]."] + #[doc = "Register a proxy account for the sender that is able to make calls on its behalf."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `proxy`: The account that the `caller` would like to make a proxy."] + #[doc = "- `proxy_type`: The permissions allowed for this proxy account."] + #[doc = "- `delay`: The announcement period required of the initial proxy. Will generally be"] + #[doc = "zero."] pub struct AddProxy { pub delegate: add_proxy::Delegate, pub proxy_type: add_proxy::ProxyType, @@ -21762,7 +24060,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove_proxy`]."] + #[doc = "Unregister a proxy account for the sender."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `proxy`: The account that the `caller` would like to remove as a proxy."] + #[doc = "- `proxy_type`: The permissions currently enabled for the removed proxy account."] pub struct RemoveProxy { pub delegate: remove_proxy::Delegate, pub proxy_type: remove_proxy::ProxyType, @@ -21789,7 +24093,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove_proxies`]."] + #[doc = "Unregister all proxy accounts for the sender."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "WARNING: This may be called on accounts created by `pure`, however if done, then"] + #[doc = "the unreserved fees will be inaccessible. **All access to this account will be lost.**"] pub struct RemoveProxies; impl ::subxt::blocks::StaticExtrinsic for RemoveProxies { const PALLET: &'static str = "Proxy"; @@ -21805,7 +24114,24 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::create_pure`]."] + #[doc = "Spawn a fresh new account that is guaranteed to be otherwise inaccessible, and"] + #[doc = "initialize it with a proxy of `proxy_type` for `origin` sender."] + #[doc = ""] + #[doc = "Requires a `Signed` origin."] + #[doc = ""] + #[doc = "- `proxy_type`: The type of the proxy that the sender will be registered as over the"] + #[doc = "new account. This will almost always be the most permissive `ProxyType` possible to"] + #[doc = "allow for maximum flexibility."] + #[doc = "- `index`: A disambiguation index, in case this is called multiple times in the same"] + #[doc = "transaction (e.g. with `utility::batch`). Unless you're using `batch` you probably just"] + #[doc = "want to use `0`."] + #[doc = "- `delay`: The announcement period required of the initial proxy. Will generally be"] + #[doc = "zero."] + #[doc = ""] + #[doc = "Fails with `Duplicate` if this has already been called in this transaction, from the"] + #[doc = "same sender, with the same parameters."] + #[doc = ""] + #[doc = "Fails if there are insufficient funds to pay for deposit."] pub struct CreatePure { pub proxy_type: create_pure::ProxyType, pub delay: create_pure::Delay, @@ -21831,7 +24157,22 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::kill_pure`]."] + #[doc = "Removes a previously spawned pure proxy."] + #[doc = ""] + #[doc = "WARNING: **All access to this account will be lost.** Any funds held in it will be"] + #[doc = "inaccessible."] + #[doc = ""] + #[doc = "Requires a `Signed` origin, and the sender account must have been created by a call to"] + #[doc = "`pure` with corresponding parameters."] + #[doc = ""] + #[doc = "- `spawner`: The account that originally called `pure` to create this account."] + #[doc = "- `index`: The disambiguation index originally passed to `pure`. Probably `0`."] + #[doc = "- `proxy_type`: The proxy type originally passed to `pure`."] + #[doc = "- `height`: The height of the chain when the call to `pure` was processed."] + #[doc = "- `ext_index`: The extrinsic index in which the call to `pure` was processed."] + #[doc = ""] + #[doc = "Fails with `NoPermission` in case the caller is not a previously created pure"] + #[doc = "account whose `pure` call has corresponding parameters."] pub struct KillPure { pub spawner: kill_pure::Spawner, pub proxy_type: kill_pure::ProxyType, @@ -21864,7 +24205,21 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::announce`]."] + #[doc = "Publish the hash of a proxy-call that will be made in the future."] + #[doc = ""] + #[doc = "This must be called some number of blocks before the corresponding `proxy` is attempted"] + #[doc = "if the delay associated with the proxy relationship is greater than zero."] + #[doc = ""] + #[doc = "No more than `MaxPending` announcements may be made at any one time."] + #[doc = ""] + #[doc = "This will take a deposit of `AnnouncementDepositFactor` as well as"] + #[doc = "`AnnouncementDepositBase` if there are no other pending announcements."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a proxy of `real`."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `real`: The account that the proxy will make a call on behalf of."] + #[doc = "- `call_hash`: The hash of the call to be made by the `real` account."] pub struct Announce { pub real: announce::Real, pub call_hash: announce::CallHash, @@ -21888,7 +24243,16 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove_announcement`]."] + #[doc = "Remove a given announcement."] + #[doc = ""] + #[doc = "May be called by a proxy account to remove a call they previously announced and return"] + #[doc = "the deposit."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `real`: The account that the proxy will make a call on behalf of."] + #[doc = "- `call_hash`: The hash of the call to be made by the `real` account."] pub struct RemoveAnnouncement { pub real: remove_announcement::Real, pub call_hash: remove_announcement::CallHash, @@ -21912,7 +24276,16 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::reject_announcement`]."] + #[doc = "Remove the given announcement of a delegate."] + #[doc = ""] + #[doc = "May be called by a target (proxied) account to remove a call that one of their delegates"] + #[doc = "(`delegate`) has announced they want to execute. The deposit is returned."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `delegate`: The account that previously announced the call."] + #[doc = "- `call_hash`: The hash of the call to be made."] pub struct RejectAnnouncement { pub delegate: reject_announcement::Delegate, pub call_hash: reject_announcement::CallHash, @@ -21937,7 +24310,17 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::proxy_announced`]."] + #[doc = "Dispatch the given `call` from an account that the sender is authorized for through"] + #[doc = "`add_proxy`."] + #[doc = ""] + #[doc = "Removes any corresponding announcement(s)."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `real`: The account that the proxy will make a call on behalf of."] + #[doc = "- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call."] + #[doc = "- `call`: The call to be made by the `real` account."] pub struct ProxyAnnounced { pub delegate: proxy_announced::Delegate, pub real: proxy_announced::Real, @@ -21960,7 +24343,15 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::proxy`]."] + #[doc = "Dispatch the given `call` from an account that the sender is authorised for through"] + #[doc = "`add_proxy`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `real`: The account that the proxy will make a call on behalf of."] + #[doc = "- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call."] + #[doc = "- `call`: The call to be made by the `real` account."] pub fn proxy( &self, real: types::proxy::Real, @@ -21976,14 +24367,22 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 27u8, 41u8, 64u8, 205u8, 145u8, 228u8, 163u8, 100u8, 114u8, 12u8, - 176u8, 150u8, 113u8, 197u8, 148u8, 23u8, 28u8, 27u8, 246u8, 111u8, - 117u8, 252u8, 190u8, 69u8, 164u8, 213u8, 185u8, 65u8, 213u8, 172u8, - 183u8, 205u8, + 253u8, 236u8, 54u8, 144u8, 19u8, 103u8, 190u8, 174u8, 231u8, 154u8, + 133u8, 175u8, 56u8, 44u8, 172u8, 25u8, 73u8, 196u8, 76u8, 61u8, 12u8, + 48u8, 245u8, 85u8, 187u8, 15u8, 111u8, 121u8, 91u8, 157u8, 111u8, + 141u8, ], ) } - #[doc = "See [`Pallet::add_proxy`]."] + #[doc = "Register a proxy account for the sender that is able to make calls on its behalf."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `proxy`: The account that the `caller` would like to make a proxy."] + #[doc = "- `proxy_type`: The permissions allowed for this proxy account."] + #[doc = "- `delay`: The announcement period required of the initial proxy. Will generally be"] + #[doc = "zero."] pub fn add_proxy( &self, delegate: types::add_proxy::Delegate, @@ -22006,7 +24405,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remove_proxy`]."] + #[doc = "Unregister a proxy account for the sender."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `proxy`: The account that the `caller` would like to remove as a proxy."] + #[doc = "- `proxy_type`: The permissions currently enabled for the removed proxy account."] pub fn remove_proxy( &self, delegate: types::remove_proxy::Delegate, @@ -22028,7 +24433,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remove_proxies`]."] + #[doc = "Unregister all proxy accounts for the sender."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "WARNING: This may be called on accounts created by `pure`, however if done, then"] + #[doc = "the unreserved fees will be inaccessible. **All access to this account will be lost.**"] pub fn remove_proxies(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Proxy", @@ -22042,7 +24452,24 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::create_pure`]."] + #[doc = "Spawn a fresh new account that is guaranteed to be otherwise inaccessible, and"] + #[doc = "initialize it with a proxy of `proxy_type` for `origin` sender."] + #[doc = ""] + #[doc = "Requires a `Signed` origin."] + #[doc = ""] + #[doc = "- `proxy_type`: The type of the proxy that the sender will be registered as over the"] + #[doc = "new account. This will almost always be the most permissive `ProxyType` possible to"] + #[doc = "allow for maximum flexibility."] + #[doc = "- `index`: A disambiguation index, in case this is called multiple times in the same"] + #[doc = "transaction (e.g. with `utility::batch`). Unless you're using `batch` you probably just"] + #[doc = "want to use `0`."] + #[doc = "- `delay`: The announcement period required of the initial proxy. Will generally be"] + #[doc = "zero."] + #[doc = ""] + #[doc = "Fails with `Duplicate` if this has already been called in this transaction, from the"] + #[doc = "same sender, with the same parameters."] + #[doc = ""] + #[doc = "Fails if there are insufficient funds to pay for deposit."] pub fn create_pure( &self, proxy_type: types::create_pure::ProxyType, @@ -22064,7 +24491,22 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::kill_pure`]."] + #[doc = "Removes a previously spawned pure proxy."] + #[doc = ""] + #[doc = "WARNING: **All access to this account will be lost.** Any funds held in it will be"] + #[doc = "inaccessible."] + #[doc = ""] + #[doc = "Requires a `Signed` origin, and the sender account must have been created by a call to"] + #[doc = "`pure` with corresponding parameters."] + #[doc = ""] + #[doc = "- `spawner`: The account that originally called `pure` to create this account."] + #[doc = "- `index`: The disambiguation index originally passed to `pure`. Probably `0`."] + #[doc = "- `proxy_type`: The proxy type originally passed to `pure`."] + #[doc = "- `height`: The height of the chain when the call to `pure` was processed."] + #[doc = "- `ext_index`: The extrinsic index in which the call to `pure` was processed."] + #[doc = ""] + #[doc = "Fails with `NoPermission` in case the caller is not a previously created pure"] + #[doc = "account whose `pure` call has corresponding parameters."] pub fn kill_pure( &self, spawner: types::kill_pure::Spawner, @@ -22090,7 +24532,21 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::announce`]."] + #[doc = "Publish the hash of a proxy-call that will be made in the future."] + #[doc = ""] + #[doc = "This must be called some number of blocks before the corresponding `proxy` is attempted"] + #[doc = "if the delay associated with the proxy relationship is greater than zero."] + #[doc = ""] + #[doc = "No more than `MaxPending` announcements may be made at any one time."] + #[doc = ""] + #[doc = "This will take a deposit of `AnnouncementDepositFactor` as well as"] + #[doc = "`AnnouncementDepositBase` if there are no other pending announcements."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a proxy of `real`."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `real`: The account that the proxy will make a call on behalf of."] + #[doc = "- `call_hash`: The hash of the call to be made by the `real` account."] pub fn announce( &self, real: types::announce::Real, @@ -22108,7 +24564,16 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remove_announcement`]."] + #[doc = "Remove a given announcement."] + #[doc = ""] + #[doc = "May be called by a proxy account to remove a call they previously announced and return"] + #[doc = "the deposit."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `real`: The account that the proxy will make a call on behalf of."] + #[doc = "- `call_hash`: The hash of the call to be made by the `real` account."] pub fn remove_announcement( &self, real: types::remove_announcement::Real, @@ -22125,7 +24590,16 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::reject_announcement`]."] + #[doc = "Remove the given announcement of a delegate."] + #[doc = ""] + #[doc = "May be called by a target (proxied) account to remove a call that one of their delegates"] + #[doc = "(`delegate`) has announced they want to execute. The deposit is returned."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `delegate`: The account that previously announced the call."] + #[doc = "- `call_hash`: The hash of the call to be made."] pub fn reject_announcement( &self, delegate: types::reject_announcement::Delegate, @@ -22145,7 +24619,17 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::proxy_announced`]."] + #[doc = "Dispatch the given `call` from an account that the sender is authorized for through"] + #[doc = "`add_proxy`."] + #[doc = ""] + #[doc = "Removes any corresponding announcement(s)."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `real`: The account that the proxy will make a call on behalf of."] + #[doc = "- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call."] + #[doc = "- `call`: The call to be made by the `real` account."] pub fn proxy_announced( &self, delegate: types::proxy_announced::Delegate, @@ -22163,9 +24647,9 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 81u8, 161u8, 1u8, 212u8, 29u8, 249u8, 101u8, 27u8, 174u8, 148u8, 164u8, - 13u8, 37u8, 206u8, 239u8, 219u8, 107u8, 255u8, 101u8, 108u8, 122u8, - 46u8, 19u8, 233u8, 82u8, 130u8, 11u8, 148u8, 40u8, 212u8, 214u8, 39u8, + 5u8, 32u8, 80u8, 204u8, 70u8, 82u8, 22u8, 142u8, 13u8, 189u8, 204u8, + 167u8, 157u8, 48u8, 49u8, 23u8, 27u8, 143u8, 159u8, 19u8, 22u8, 218u8, + 37u8, 32u8, 67u8, 24u8, 132u8, 157u8, 10u8, 176u8, 94u8, 69u8, ], ) } @@ -22350,7 +24834,7 @@ pub mod api { pub fn proxies_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::proxies::Proxies, (), ::subxt::storage::address::Yes, @@ -22359,7 +24843,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Proxy", "Proxies", - vec![], + (), [ 92u8, 131u8, 10u8, 14u8, 241u8, 148u8, 230u8, 81u8, 54u8, 152u8, 147u8, 180u8, 85u8, 28u8, 87u8, 215u8, 110u8, 13u8, 158u8, 207u8, 77u8, 102u8, @@ -22373,7 +24857,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::proxies::Proxies, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -22382,9 +24866,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Proxy", "Proxies", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 92u8, 131u8, 10u8, 14u8, 241u8, 148u8, 230u8, 81u8, 54u8, 152u8, 147u8, 180u8, 85u8, 28u8, 87u8, 215u8, 110u8, 13u8, 158u8, 207u8, 77u8, 102u8, @@ -22396,7 +24878,7 @@ pub mod api { pub fn announcements_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::announcements::Announcements, (), ::subxt::storage::address::Yes, @@ -22405,7 +24887,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Proxy", "Announcements", - vec![], + (), [ 129u8, 228u8, 198u8, 210u8, 90u8, 69u8, 151u8, 198u8, 206u8, 174u8, 148u8, 58u8, 134u8, 14u8, 53u8, 56u8, 234u8, 71u8, 84u8, 247u8, 246u8, @@ -22419,7 +24901,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::announcements::Announcements, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -22428,9 +24910,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Proxy", "Announcements", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 129u8, 228u8, 198u8, 210u8, 90u8, 69u8, 151u8, 198u8, 206u8, 174u8, 148u8, 58u8, 134u8, 14u8, 53u8, 56u8, 234u8, 71u8, 84u8, 247u8, 246u8, @@ -22566,7 +25046,18 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::as_multi_threshold_1`]."] + #[doc = "Immediately dispatch a multi-signature call using a single approval from the caller."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `other_signatories`: The accounts (other than the sender) who are part of the"] + #[doc = "multi-signature, but do not participate in the approval process."] + #[doc = "- `call`: The call to be executed."] + #[doc = ""] + #[doc = "Result is equivalent to the dispatched result."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "O(Z + C) where Z is the length of the call and C its execution weight."] pub struct AsMultiThreshold1 { pub other_signatories: as_multi_threshold1::OtherSignatories, pub call: ::std::boxed::Box, @@ -22590,7 +25081,45 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::as_multi`]."] + #[doc = "Register approval for a dispatch to be made from a deterministic composite account if"] + #[doc = "approved by a total of `threshold - 1` of `other_signatories`."] + #[doc = ""] + #[doc = "If there are enough, then dispatch the call."] + #[doc = ""] + #[doc = "Payment: `DepositBase` will be reserved if this is the first approval, plus"] + #[doc = "`threshold` times `DepositFactor`. It is returned once this dispatch happens or"] + #[doc = "is cancelled."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `threshold`: The total number of approvals for this dispatch before it is executed."] + #[doc = "- `other_signatories`: The accounts (other than the sender) who can approve this"] + #[doc = "dispatch. May not be empty."] + #[doc = "- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is"] + #[doc = "not the first approval, then it must be `Some`, with the timepoint (block number and"] + #[doc = "transaction index) of the first approval transaction."] + #[doc = "- `call`: The call to be executed."] + #[doc = ""] + #[doc = "NOTE: Unless this is the final approval, you will generally want to use"] + #[doc = "`approve_as_multi` instead, since it only requires a hash of the call."] + #[doc = ""] + #[doc = "Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise"] + #[doc = "on success, result is `Ok` and the result from the interior call, if it was executed,"] + #[doc = "may be found in the deposited `MultisigExecuted` event."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(S + Z + Call)`."] + #[doc = "- Up to one balance-reserve or unreserve operation."] + #[doc = "- One passthrough operation, one insert, both `O(S)` where `S` is the number of"] + #[doc = " signatories. `S` is capped by `MaxSignatories`, with weight being proportional."] + #[doc = "- One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len."] + #[doc = "- One encode & hash, both of complexity `O(S)`."] + #[doc = "- Up to one binary search and insert (`O(logS + S)`)."] + #[doc = "- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove."] + #[doc = "- One event."] + #[doc = "- The weight of the `call`."] + #[doc = "- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit"] + #[doc = " taken for its lifetime of `DepositBase + threshold * DepositFactor`."] pub struct AsMulti { pub threshold: as_multi::Threshold, pub other_signatories: as_multi::OtherSignatories, @@ -22622,7 +25151,36 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::approve_as_multi`]."] + #[doc = "Register approval for a dispatch to be made from a deterministic composite account if"] + #[doc = "approved by a total of `threshold - 1` of `other_signatories`."] + #[doc = ""] + #[doc = "Payment: `DepositBase` will be reserved if this is the first approval, plus"] + #[doc = "`threshold` times `DepositFactor`. It is returned once this dispatch happens or"] + #[doc = "is cancelled."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `threshold`: The total number of approvals for this dispatch before it is executed."] + #[doc = "- `other_signatories`: The accounts (other than the sender) who can approve this"] + #[doc = "dispatch. May not be empty."] + #[doc = "- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is"] + #[doc = "not the first approval, then it must be `Some`, with the timepoint (block number and"] + #[doc = "transaction index) of the first approval transaction."] + #[doc = "- `call_hash`: The hash of the call to be executed."] + #[doc = ""] + #[doc = "NOTE: If this is the final approval, you will want to use `as_multi` instead."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(S)`."] + #[doc = "- Up to one balance-reserve or unreserve operation."] + #[doc = "- One passthrough operation, one insert, both `O(S)` where `S` is the number of"] + #[doc = " signatories. `S` is capped by `MaxSignatories`, with weight being proportional."] + #[doc = "- One encode & hash, both of complexity `O(S)`."] + #[doc = "- Up to one binary search and insert (`O(logS + S)`)."] + #[doc = "- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove."] + #[doc = "- One event."] + #[doc = "- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit"] + #[doc = " taken for its lifetime of `DepositBase + threshold * DepositFactor`."] pub struct ApproveAsMulti { pub threshold: approve_as_multi::Threshold, pub other_signatories: approve_as_multi::OtherSignatories, @@ -22654,7 +25212,27 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::cancel_as_multi`]."] + #[doc = "Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously"] + #[doc = "for this operation will be unreserved on success."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `threshold`: The total number of approvals for this dispatch before it is executed."] + #[doc = "- `other_signatories`: The accounts (other than the sender) who can approve this"] + #[doc = "dispatch. May not be empty."] + #[doc = "- `timepoint`: The timepoint (block number and transaction index) of the first approval"] + #[doc = "transaction for this dispatch."] + #[doc = "- `call_hash`: The hash of the call to be executed."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(S)`."] + #[doc = "- Up to one balance-reserve or unreserve operation."] + #[doc = "- One passthrough operation, one insert, both `O(S)` where `S` is the number of"] + #[doc = " signatories. `S` is capped by `MaxSignatories`, with weight being proportional."] + #[doc = "- One encode & hash, both of complexity `O(S)`."] + #[doc = "- One event."] + #[doc = "- I/O: 1 read `O(S)`, one remove."] + #[doc = "- Storage: removes one item."] pub struct CancelAsMulti { pub threshold: cancel_as_multi::Threshold, pub other_signatories: cancel_as_multi::OtherSignatories, @@ -22676,7 +25254,18 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::as_multi_threshold_1`]."] + #[doc = "Immediately dispatch a multi-signature call using a single approval from the caller."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `other_signatories`: The accounts (other than the sender) who are part of the"] + #[doc = "multi-signature, but do not participate in the approval process."] + #[doc = "- `call`: The call to be executed."] + #[doc = ""] + #[doc = "Result is equivalent to the dispatched result."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "O(Z + C) where Z is the length of the call and C its execution weight."] pub fn as_multi_threshold_1( &self, other_signatories: types::as_multi_threshold1::OtherSignatories, @@ -22690,14 +25279,52 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 160u8, 32u8, 154u8, 37u8, 200u8, 55u8, 129u8, 224u8, 146u8, 248u8, - 74u8, 123u8, 141u8, 242u8, 178u8, 218u8, 203u8, 229u8, 3u8, 189u8, - 150u8, 28u8, 101u8, 126u8, 182u8, 233u8, 181u8, 254u8, 146u8, 180u8, - 124u8, 102u8, + 223u8, 197u8, 77u8, 59u8, 210u8, 4u8, 228u8, 221u8, 213u8, 150u8, + 108u8, 151u8, 213u8, 147u8, 174u8, 207u8, 142u8, 149u8, 68u8, 126u8, + 75u8, 188u8, 206u8, 13u8, 103u8, 43u8, 249u8, 8u8, 172u8, 151u8, 212u8, + 57u8, ], ) } - #[doc = "See [`Pallet::as_multi`]."] + #[doc = "Register approval for a dispatch to be made from a deterministic composite account if"] + #[doc = "approved by a total of `threshold - 1` of `other_signatories`."] + #[doc = ""] + #[doc = "If there are enough, then dispatch the call."] + #[doc = ""] + #[doc = "Payment: `DepositBase` will be reserved if this is the first approval, plus"] + #[doc = "`threshold` times `DepositFactor`. It is returned once this dispatch happens or"] + #[doc = "is cancelled."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `threshold`: The total number of approvals for this dispatch before it is executed."] + #[doc = "- `other_signatories`: The accounts (other than the sender) who can approve this"] + #[doc = "dispatch. May not be empty."] + #[doc = "- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is"] + #[doc = "not the first approval, then it must be `Some`, with the timepoint (block number and"] + #[doc = "transaction index) of the first approval transaction."] + #[doc = "- `call`: The call to be executed."] + #[doc = ""] + #[doc = "NOTE: Unless this is the final approval, you will generally want to use"] + #[doc = "`approve_as_multi` instead, since it only requires a hash of the call."] + #[doc = ""] + #[doc = "Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise"] + #[doc = "on success, result is `Ok` and the result from the interior call, if it was executed,"] + #[doc = "may be found in the deposited `MultisigExecuted` event."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(S + Z + Call)`."] + #[doc = "- Up to one balance-reserve or unreserve operation."] + #[doc = "- One passthrough operation, one insert, both `O(S)` where `S` is the number of"] + #[doc = " signatories. `S` is capped by `MaxSignatories`, with weight being proportional."] + #[doc = "- One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len."] + #[doc = "- One encode & hash, both of complexity `O(S)`."] + #[doc = "- Up to one binary search and insert (`O(logS + S)`)."] + #[doc = "- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove."] + #[doc = "- One event."] + #[doc = "- The weight of the `call`."] + #[doc = "- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit"] + #[doc = " taken for its lifetime of `DepositBase + threshold * DepositFactor`."] pub fn as_multi( &self, threshold: types::as_multi::Threshold, @@ -22717,14 +25344,43 @@ pub mod api { max_weight, }, [ - 253u8, 142u8, 244u8, 88u8, 243u8, 78u8, 231u8, 191u8, 169u8, 215u8, - 44u8, 15u8, 85u8, 234u8, 100u8, 22u8, 80u8, 150u8, 80u8, 119u8, 5u8, - 183u8, 239u8, 148u8, 100u8, 219u8, 211u8, 155u8, 23u8, 228u8, 34u8, - 231u8, + 185u8, 170u8, 191u8, 214u8, 209u8, 18u8, 122u8, 101u8, 51u8, 109u8, + 11u8, 192u8, 57u8, 170u8, 232u8, 162u8, 225u8, 99u8, 91u8, 218u8, 60u8, + 85u8, 159u8, 103u8, 150u8, 185u8, 158u8, 203u8, 228u8, 218u8, 164u8, + 63u8, ], ) } - #[doc = "See [`Pallet::approve_as_multi`]."] + #[doc = "Register approval for a dispatch to be made from a deterministic composite account if"] + #[doc = "approved by a total of `threshold - 1` of `other_signatories`."] + #[doc = ""] + #[doc = "Payment: `DepositBase` will be reserved if this is the first approval, plus"] + #[doc = "`threshold` times `DepositFactor`. It is returned once this dispatch happens or"] + #[doc = "is cancelled."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `threshold`: The total number of approvals for this dispatch before it is executed."] + #[doc = "- `other_signatories`: The accounts (other than the sender) who can approve this"] + #[doc = "dispatch. May not be empty."] + #[doc = "- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is"] + #[doc = "not the first approval, then it must be `Some`, with the timepoint (block number and"] + #[doc = "transaction index) of the first approval transaction."] + #[doc = "- `call_hash`: The hash of the call to be executed."] + #[doc = ""] + #[doc = "NOTE: If this is the final approval, you will want to use `as_multi` instead."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(S)`."] + #[doc = "- Up to one balance-reserve or unreserve operation."] + #[doc = "- One passthrough operation, one insert, both `O(S)` where `S` is the number of"] + #[doc = " signatories. `S` is capped by `MaxSignatories`, with weight being proportional."] + #[doc = "- One encode & hash, both of complexity `O(S)`."] + #[doc = "- Up to one binary search and insert (`O(logS + S)`)."] + #[doc = "- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove."] + #[doc = "- One event."] + #[doc = "- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit"] + #[doc = " taken for its lifetime of `DepositBase + threshold * DepositFactor`."] pub fn approve_as_multi( &self, threshold: types::approve_as_multi::Threshold, @@ -22750,7 +25406,27 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::cancel_as_multi`]."] + #[doc = "Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously"] + #[doc = "for this operation will be unreserved on success."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `threshold`: The total number of approvals for this dispatch before it is executed."] + #[doc = "- `other_signatories`: The accounts (other than the sender) who can approve this"] + #[doc = "dispatch. May not be empty."] + #[doc = "- `timepoint`: The timepoint (block number and transaction index) of the first approval"] + #[doc = "transaction for this dispatch."] + #[doc = "- `call_hash`: The hash of the call to be executed."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(S)`."] + #[doc = "- Up to one balance-reserve or unreserve operation."] + #[doc = "- One passthrough operation, one insert, both `O(S)` where `S` is the number of"] + #[doc = " signatories. `S` is capped by `MaxSignatories`, with weight being proportional."] + #[doc = "- One encode & hash, both of complexity `O(S)`."] + #[doc = "- One event."] + #[doc = "- I/O: 1 read `O(S)`, one remove."] + #[doc = "- Storage: removes one item."] pub fn cancel_as_multi( &self, threshold: types::cancel_as_multi::Threshold, @@ -22918,7 +25594,7 @@ pub mod api { pub fn multisigs_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::multisigs::Multisigs, (), (), @@ -22927,7 +25603,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Multisig", "Multisigs", - vec![], + (), [ 154u8, 109u8, 45u8, 18u8, 155u8, 151u8, 81u8, 28u8, 86u8, 127u8, 189u8, 151u8, 49u8, 61u8, 12u8, 149u8, 84u8, 61u8, 110u8, 197u8, 200u8, 140u8, @@ -22940,7 +25616,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::multisigs::Multisigs, (), (), @@ -22949,9 +25625,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Multisig", "Multisigs", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 154u8, 109u8, 45u8, 18u8, 155u8, 151u8, 81u8, 28u8, 86u8, 127u8, 189u8, 151u8, 49u8, 61u8, 12u8, 149u8, 84u8, 61u8, 110u8, 197u8, 200u8, 140u8, @@ -22965,7 +25639,10 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey, + ::subxt::storage::address::StaticStorageKey, + ), types::multisigs::Multisigs, ::subxt::storage::address::Yes, (), @@ -22974,10 +25651,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Multisig", "Multisigs", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 154u8, 109u8, 45u8, 18u8, 155u8, 151u8, 81u8, 28u8, 86u8, 127u8, 189u8, 151u8, 49u8, 61u8, 12u8, 149u8, 84u8, 61u8, 110u8, 197u8, 200u8, 140u8, @@ -23065,7 +25742,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::note_preimage`]."] + #[doc = "Register a preimage on-chain."] + #[doc = ""] + #[doc = "If the preimage was previously requested, no fees or deposits are taken for providing"] + #[doc = "the preimage. Otherwise, a deposit is taken proportional to the size of the preimage."] pub struct NotePreimage { pub bytes: note_preimage::Bytes, } @@ -23087,7 +25767,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::unnote_preimage`]."] + #[doc = "Clear an unrequested preimage from the runtime storage."] + #[doc = ""] + #[doc = "If `len` is provided, then it will be a much cheaper operation."] + #[doc = ""] + #[doc = "- `hash`: The hash of the preimage to be removed from the store."] + #[doc = "- `len`: The length of the preimage of `hash`."] pub struct UnnotePreimage { pub hash: unnote_preimage::Hash, } @@ -23109,7 +25794,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::request_preimage`]."] + #[doc = "Request a preimage be uploaded to the chain without paying any fees or deposits."] + #[doc = ""] + #[doc = "If the preimage requests has already been provided on-chain, we unreserve any deposit"] + #[doc = "a user may have paid, and take the control of the preimage out of their hands."] pub struct RequestPreimage { pub hash: request_preimage::Hash, } @@ -23131,7 +25819,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::unrequest_preimage`]."] + #[doc = "Clear a previously made request for a preimage."] + #[doc = ""] + #[doc = "NOTE: THIS MUST NOT BE CALLED ON `hash` MORE TIMES THAN `request_preimage`."] pub struct UnrequestPreimage { pub hash: unrequest_preimage::Hash, } @@ -23153,7 +25843,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::ensure_updated`]."] + #[doc = "Ensure that the a bulk of pre-images is upgraded."] + #[doc = ""] + #[doc = "The caller pays no fee if at least 90% of pre-images were successfully updated."] pub struct EnsureUpdated { pub hashes: ensure_updated::Hashes, } @@ -23168,7 +25860,10 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::note_preimage`]."] + #[doc = "Register a preimage on-chain."] + #[doc = ""] + #[doc = "If the preimage was previously requested, no fees or deposits are taken for providing"] + #[doc = "the preimage. Otherwise, a deposit is taken proportional to the size of the preimage."] pub fn note_preimage( &self, bytes: types::note_preimage::Bytes, @@ -23184,7 +25879,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::unnote_preimage`]."] + #[doc = "Clear an unrequested preimage from the runtime storage."] + #[doc = ""] + #[doc = "If `len` is provided, then it will be a much cheaper operation."] + #[doc = ""] + #[doc = "- `hash`: The hash of the preimage to be removed from the store."] + #[doc = "- `len`: The length of the preimage of `hash`."] pub fn unnote_preimage( &self, hash: types::unnote_preimage::Hash, @@ -23201,7 +25901,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::request_preimage`]."] + #[doc = "Request a preimage be uploaded to the chain without paying any fees or deposits."] + #[doc = ""] + #[doc = "If the preimage requests has already been provided on-chain, we unreserve any deposit"] + #[doc = "a user may have paid, and take the control of the preimage out of their hands."] pub fn request_preimage( &self, hash: types::request_preimage::Hash, @@ -23217,7 +25920,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::unrequest_preimage`]."] + #[doc = "Clear a previously made request for a preimage."] + #[doc = ""] + #[doc = "NOTE: THIS MUST NOT BE CALLED ON `hash` MORE TIMES THAN `request_preimage`."] pub fn unrequest_preimage( &self, hash: types::unrequest_preimage::Hash, @@ -23234,7 +25939,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::ensure_updated`]."] + #[doc = "Ensure that the a bulk of pre-images is upgraded."] + #[doc = ""] + #[doc = "The caller pays no fee if at least 90% of pre-images were successfully updated."] pub fn ensure_updated( &self, hashes: types::ensure_updated::Hashes, @@ -23360,7 +26067,7 @@ pub mod api { pub fn status_for_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::status_for::StatusFor, (), (), @@ -23369,7 +26076,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Preimage", "StatusFor", - vec![], + (), [ 187u8, 100u8, 54u8, 112u8, 96u8, 129u8, 36u8, 149u8, 127u8, 226u8, 126u8, 171u8, 72u8, 189u8, 59u8, 126u8, 204u8, 125u8, 67u8, 204u8, @@ -23383,7 +26090,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::status_for::StatusFor, ::subxt::storage::address::Yes, (), @@ -23392,9 +26099,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Preimage", "StatusFor", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 187u8, 100u8, 54u8, 112u8, 96u8, 129u8, 36u8, 149u8, 127u8, 226u8, 126u8, 171u8, 72u8, 189u8, 59u8, 126u8, 204u8, 125u8, 67u8, 204u8, @@ -23407,7 +26112,7 @@ pub mod api { pub fn request_status_for_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::request_status_for::RequestStatusFor, (), (), @@ -23416,7 +26121,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Preimage", "RequestStatusFor", - vec![], + (), [ 72u8, 59u8, 254u8, 211u8, 96u8, 223u8, 10u8, 64u8, 6u8, 139u8, 213u8, 85u8, 14u8, 29u8, 166u8, 37u8, 140u8, 124u8, 186u8, 156u8, 172u8, @@ -23429,7 +26134,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::request_status_for::RequestStatusFor, ::subxt::storage::address::Yes, (), @@ -23438,9 +26143,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Preimage", "RequestStatusFor", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 72u8, 59u8, 254u8, 211u8, 96u8, 223u8, 10u8, 64u8, 6u8, 139u8, 213u8, 85u8, 14u8, 29u8, 166u8, 37u8, 140u8, 124u8, 186u8, 156u8, 172u8, @@ -23451,7 +26154,7 @@ pub mod api { pub fn preimage_for_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::preimage_for::PreimageFor, (), (), @@ -23460,7 +26163,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Preimage", "PreimageFor", - vec![], + (), [ 106u8, 5u8, 17u8, 46u8, 6u8, 184u8, 177u8, 113u8, 169u8, 34u8, 119u8, 141u8, 117u8, 40u8, 30u8, 94u8, 187u8, 35u8, 206u8, 216u8, 143u8, @@ -23473,7 +26176,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::preimage_for::PreimageFor, (), (), @@ -23482,9 +26185,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Preimage", "PreimageFor", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 106u8, 5u8, 17u8, 46u8, 6u8, 184u8, 177u8, 113u8, 169u8, 34u8, 119u8, 141u8, 117u8, 40u8, 30u8, 94u8, 187u8, 35u8, 206u8, 216u8, 143u8, @@ -23498,7 +26199,10 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey, + ::subxt::storage::address::StaticStorageKey, + ), types::preimage_for::PreimageFor, ::subxt::storage::address::Yes, (), @@ -23507,10 +26211,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Preimage", "PreimageFor", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 106u8, 5u8, 17u8, 46u8, 6u8, 184u8, 177u8, 113u8, 169u8, 34u8, 119u8, 141u8, 117u8, 40u8, 30u8, 94u8, 187u8, 35u8, 206u8, 216u8, 143u8, @@ -23545,7 +26249,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::create`]."] + #[doc = "Initialize a conversion rate to native balance for the given asset."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)"] pub struct Create { pub asset_kind: ::std::boxed::Box, pub rate: create::Rate, @@ -23570,7 +26277,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::update`]."] + #[doc = "Update the conversion rate to native balance for the given asset."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)"] pub struct Update { pub asset_kind: ::std::boxed::Box, pub rate: update::Rate, @@ -23595,7 +26305,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove`]."] + #[doc = "Remove an existing conversion rate to native balance for the given asset."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)"] pub struct Remove { pub asset_kind: ::std::boxed::Box, } @@ -23611,7 +26324,10 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::create`]."] + #[doc = "Initialize a conversion rate to native balance for the given asset."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)"] pub fn create( &self, asset_kind: types::create::AssetKind, @@ -23631,7 +26347,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::update`]."] + #[doc = "Update the conversion rate to native balance for the given asset."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)"] pub fn update( &self, asset_kind: types::update::AssetKind, @@ -23651,7 +26370,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remove`]."] + #[doc = "Remove an existing conversion rate to native balance for the given asset."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)"] pub fn remove( &self, asset_kind: types::remove::AssetKind, @@ -23769,7 +26491,7 @@ pub mod api { pub fn conversion_rate_to_native_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::conversion_rate_to_native::ConversionRateToNative, (), (), @@ -23778,7 +26500,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "AssetRate", "ConversionRateToNative", - vec![], + (), [ 230u8, 127u8, 110u8, 126u8, 79u8, 168u8, 134u8, 97u8, 195u8, 105u8, 16u8, 57u8, 197u8, 104u8, 87u8, 144u8, 83u8, 188u8, 85u8, 253u8, 230u8, @@ -23794,7 +26516,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::conversion_rate_to_native::Param0, + >, types::conversion_rate_to_native::ConversionRateToNative, ::subxt::storage::address::Yes, (), @@ -23803,9 +26527,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "AssetRate", "ConversionRateToNative", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 230u8, 127u8, 110u8, 126u8, 79u8, 168u8, 134u8, 97u8, 195u8, 105u8, 16u8, 57u8, 197u8, 104u8, 87u8, 144u8, 83u8, 188u8, 85u8, 253u8, 230u8, @@ -23840,7 +26562,18 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::propose_bounty`]."] + #[doc = "Propose a new bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Payment: `TipReportDepositBase` will be reserved from the origin account, as well as"] + #[doc = "`DataDepositPerByte` for each byte in `reason`. It will be unreserved upon approval,"] + #[doc = "or slashed when rejected."] + #[doc = ""] + #[doc = "- `curator`: The curator account whom will manage this bounty."] + #[doc = "- `fee`: The curator fee."] + #[doc = "- `value`: The total payment amount of this bounty, curator fee included."] + #[doc = "- `description`: The description of this bounty."] pub struct ProposeBounty { #[codec(compact)] pub value: propose_bounty::Value, @@ -23865,7 +26598,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::approve_bounty`]."] + #[doc = "Approve a bounty proposal. At a later time, the bounty will be funded and become active"] + #[doc = "and the original deposit will be returned."] + #[doc = ""] + #[doc = "May only be called from `T::SpendOrigin`."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub struct ApproveBounty { #[codec(compact)] pub bounty_id: approve_bounty::BountyId, @@ -23888,7 +26627,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::propose_curator`]."] + #[doc = "Propose a curator to a funded bounty."] + #[doc = ""] + #[doc = "May only be called from `T::SpendOrigin`."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub struct ProposeCurator { #[codec(compact)] pub bounty_id: propose_curator::BountyId, @@ -23917,7 +26661,23 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::unassign_curator`]."] + #[doc = "Unassign curator from a bounty."] + #[doc = ""] + #[doc = "This function can only be called by the `RejectOrigin` a signed origin."] + #[doc = ""] + #[doc = "If this function is called by the `RejectOrigin`, we assume that the curator is"] + #[doc = "malicious or inactive. As a result, we will slash the curator when possible."] + #[doc = ""] + #[doc = "If the origin is the curator, we take this as a sign they are unable to do their job and"] + #[doc = "they willingly give up. We could slash them, but for now we allow them to recover their"] + #[doc = "deposit and exit without issue. (We may want to change this if it is abused.)"] + #[doc = ""] + #[doc = "Finally, the origin can be anyone if and only if the curator is \"inactive\". This allows"] + #[doc = "anyone in the community to call out that a curator is not doing their due diligence, and"] + #[doc = "we should pick a new curator. In this case the curator should also be slashed."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub struct UnassignCurator { #[codec(compact)] pub bounty_id: unassign_curator::BountyId, @@ -23940,7 +26700,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::accept_curator`]."] + #[doc = "Accept the curator role for a bounty."] + #[doc = "A deposit will be reserved from curator and refund upon successful payout."] + #[doc = ""] + #[doc = "May only be called from the curator."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub struct AcceptCurator { #[codec(compact)] pub bounty_id: accept_curator::BountyId, @@ -23963,7 +26729,16 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::award_bounty`]."] + #[doc = "Award bounty to a beneficiary account. The beneficiary will be able to claim the funds"] + #[doc = "after a delay."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the curator of this bounty."] + #[doc = ""] + #[doc = "- `bounty_id`: Bounty ID to award."] + #[doc = "- `beneficiary`: The beneficiary account whom will receive the payout."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub struct AwardBounty { #[codec(compact)] pub bounty_id: award_bounty::BountyId, @@ -23989,7 +26764,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::claim_bounty`]."] + #[doc = "Claim the payout from an awarded bounty after payout delay."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the beneficiary of this bounty."] + #[doc = ""] + #[doc = "- `bounty_id`: Bounty ID to claim."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub struct ClaimBounty { #[codec(compact)] pub bounty_id: claim_bounty::BountyId, @@ -24012,7 +26794,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::close_bounty`]."] + #[doc = "Cancel a proposed or active bounty. All the funds will be sent to treasury and"] + #[doc = "the curator deposit will be unreserved if possible."] + #[doc = ""] + #[doc = "Only `T::RejectOrigin` is able to cancel a bounty."] + #[doc = ""] + #[doc = "- `bounty_id`: Bounty ID to cancel."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub struct CloseBounty { #[codec(compact)] pub bounty_id: close_bounty::BountyId, @@ -24035,7 +26825,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::extend_bounty_expiry`]."] + #[doc = "Extend the expiry time of an active bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the curator of this bounty."] + #[doc = ""] + #[doc = "- `bounty_id`: Bounty ID to extend."] + #[doc = "- `remark`: additional information."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub struct ExtendBountyExpiry { #[codec(compact)] pub bounty_id: extend_bounty_expiry::BountyId, @@ -24053,7 +26851,18 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::propose_bounty`]."] + #[doc = "Propose a new bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Payment: `TipReportDepositBase` will be reserved from the origin account, as well as"] + #[doc = "`DataDepositPerByte` for each byte in `reason`. It will be unreserved upon approval,"] + #[doc = "or slashed when rejected."] + #[doc = ""] + #[doc = "- `curator`: The curator account whom will manage this bounty."] + #[doc = "- `fee`: The curator fee."] + #[doc = "- `value`: The total payment amount of this bounty, curator fee included."] + #[doc = "- `description`: The description of this bounty."] pub fn propose_bounty( &self, value: types::propose_bounty::Value, @@ -24070,7 +26879,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::approve_bounty`]."] + #[doc = "Approve a bounty proposal. At a later time, the bounty will be funded and become active"] + #[doc = "and the original deposit will be returned."] + #[doc = ""] + #[doc = "May only be called from `T::SpendOrigin`."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub fn approve_bounty( &self, bounty_id: types::approve_bounty::BountyId, @@ -24087,7 +26902,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::propose_curator`]."] + #[doc = "Propose a curator to a funded bounty."] + #[doc = ""] + #[doc = "May only be called from `T::SpendOrigin`."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub fn propose_curator( &self, bounty_id: types::propose_curator::BountyId, @@ -24109,7 +26929,23 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::unassign_curator`]."] + #[doc = "Unassign curator from a bounty."] + #[doc = ""] + #[doc = "This function can only be called by the `RejectOrigin` a signed origin."] + #[doc = ""] + #[doc = "If this function is called by the `RejectOrigin`, we assume that the curator is"] + #[doc = "malicious or inactive. As a result, we will slash the curator when possible."] + #[doc = ""] + #[doc = "If the origin is the curator, we take this as a sign they are unable to do their job and"] + #[doc = "they willingly give up. We could slash them, but for now we allow them to recover their"] + #[doc = "deposit and exit without issue. (We may want to change this if it is abused.)"] + #[doc = ""] + #[doc = "Finally, the origin can be anyone if and only if the curator is \"inactive\". This allows"] + #[doc = "anyone in the community to call out that a curator is not doing their due diligence, and"] + #[doc = "we should pick a new curator. In this case the curator should also be slashed."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub fn unassign_curator( &self, bounty_id: types::unassign_curator::BountyId, @@ -24126,7 +26962,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::accept_curator`]."] + #[doc = "Accept the curator role for a bounty."] + #[doc = "A deposit will be reserved from curator and refund upon successful payout."] + #[doc = ""] + #[doc = "May only be called from the curator."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub fn accept_curator( &self, bounty_id: types::accept_curator::BountyId, @@ -24142,7 +26984,16 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::award_bounty`]."] + #[doc = "Award bounty to a beneficiary account. The beneficiary will be able to claim the funds"] + #[doc = "after a delay."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the curator of this bounty."] + #[doc = ""] + #[doc = "- `bounty_id`: Bounty ID to award."] + #[doc = "- `beneficiary`: The beneficiary account whom will receive the payout."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub fn award_bounty( &self, bounty_id: types::award_bounty::BountyId, @@ -24162,7 +27013,14 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::claim_bounty`]."] + #[doc = "Claim the payout from an awarded bounty after payout delay."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the beneficiary of this bounty."] + #[doc = ""] + #[doc = "- `bounty_id`: Bounty ID to claim."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub fn claim_bounty( &self, bounty_id: types::claim_bounty::BountyId, @@ -24179,7 +27037,15 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::close_bounty`]."] + #[doc = "Cancel a proposed or active bounty. All the funds will be sent to treasury and"] + #[doc = "the curator deposit will be unreserved if possible."] + #[doc = ""] + #[doc = "Only `T::RejectOrigin` is able to cancel a bounty."] + #[doc = ""] + #[doc = "- `bounty_id`: Bounty ID to cancel."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub fn close_bounty( &self, bounty_id: types::close_bounty::BountyId, @@ -24196,7 +27062,15 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::extend_bounty_expiry`]."] + #[doc = "Extend the expiry time of an active bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the curator of this bounty."] + #[doc = ""] + #[doc = "- `bounty_id`: Bounty ID to extend."] + #[doc = "- `remark`: additional information."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] pub fn extend_bounty_expiry( &self, bounty_id: types::extend_bounty_expiry::BountyId, @@ -24514,7 +27388,7 @@ pub mod api { pub fn bounty_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::bounty_count::BountyCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -24523,7 +27397,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Bounties", "BountyCount", - vec![], + (), [ 120u8, 204u8, 26u8, 150u8, 37u8, 81u8, 43u8, 223u8, 180u8, 252u8, 142u8, 144u8, 109u8, 5u8, 184u8, 72u8, 223u8, 230u8, 66u8, 196u8, 14u8, @@ -24536,7 +27410,7 @@ pub mod api { pub fn bounties_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::bounties::Bounties, (), (), @@ -24545,7 +27419,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Bounties", "Bounties", - vec![], + (), [ 183u8, 96u8, 172u8, 86u8, 167u8, 129u8, 51u8, 179u8, 238u8, 155u8, 196u8, 77u8, 158u8, 102u8, 188u8, 19u8, 79u8, 178u8, 145u8, 189u8, @@ -24559,7 +27433,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::bounties::Bounties, ::subxt::storage::address::Yes, (), @@ -24568,9 +27442,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Bounties", "Bounties", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 183u8, 96u8, 172u8, 86u8, 167u8, 129u8, 51u8, 179u8, 238u8, 155u8, 196u8, 77u8, 158u8, 102u8, 188u8, 19u8, 79u8, 178u8, 145u8, 189u8, @@ -24583,7 +27455,7 @@ pub mod api { pub fn bounty_descriptions_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::bounty_descriptions::BountyDescriptions, (), (), @@ -24592,7 +27464,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Bounties", "BountyDescriptions", - vec![], + (), [ 71u8, 40u8, 133u8, 84u8, 55u8, 207u8, 169u8, 189u8, 160u8, 51u8, 202u8, 144u8, 15u8, 226u8, 97u8, 114u8, 54u8, 247u8, 53u8, 26u8, 36u8, 54u8, @@ -24605,7 +27477,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::bounty_descriptions::BountyDescriptions, ::subxt::storage::address::Yes, (), @@ -24614,9 +27486,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Bounties", "BountyDescriptions", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 71u8, 40u8, 133u8, 84u8, 55u8, 207u8, 169u8, 189u8, 160u8, 51u8, 202u8, 144u8, 15u8, 226u8, 97u8, 114u8, 54u8, 247u8, 53u8, 26u8, 36u8, 54u8, @@ -24628,7 +27498,7 @@ pub mod api { pub fn bounty_approvals( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::bounty_approvals::BountyApprovals, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -24637,7 +27507,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Bounties", "BountyApprovals", - vec![], + (), [ 182u8, 228u8, 0u8, 46u8, 176u8, 25u8, 222u8, 180u8, 51u8, 57u8, 14u8, 0u8, 69u8, 160u8, 64u8, 27u8, 88u8, 29u8, 227u8, 146u8, 2u8, 121u8, @@ -24816,7 +27686,25 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::add_child_bounty`]."] + #[doc = "Add a new child-bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the curator of parent"] + #[doc = "bounty and the parent bounty must be in \"active\" state."] + #[doc = ""] + #[doc = "Child-bounty gets added successfully & fund gets transferred from"] + #[doc = "parent bounty to child-bounty account, if parent bounty has enough"] + #[doc = "funds, else the call fails."] + #[doc = ""] + #[doc = "Upper bound to maximum number of active child bounties that can be"] + #[doc = "added are managed via runtime trait config"] + #[doc = "[`Config::MaxActiveChildBountyCount`]."] + #[doc = ""] + #[doc = "If the call is success, the status of child-bounty is updated to"] + #[doc = "\"Added\"."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty for which child-bounty is being added."] + #[doc = "- `value`: Value for executing the proposal."] + #[doc = "- `description`: Text description for the child-bounty."] pub struct AddChildBounty { #[codec(compact)] pub parent_bounty_id: add_child_bounty::ParentBountyId, @@ -24844,7 +27732,21 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::propose_curator`]."] + #[doc = "Propose curator for funded child-bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be curator of parent bounty."] + #[doc = ""] + #[doc = "Parent bounty must be in active state, for this child-bounty call to"] + #[doc = "work."] + #[doc = ""] + #[doc = "Child-bounty must be in \"Added\" state, for processing the call. And"] + #[doc = "state of child-bounty is moved to \"CuratorProposed\" on successful"] + #[doc = "call completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] + #[doc = "- `curator`: Address of child-bounty curator."] + #[doc = "- `fee`: payment fee to child-bounty curator for execution."] pub struct ProposeCurator { #[codec(compact)] pub parent_bounty_id: propose_curator::ParentBountyId, @@ -24876,7 +27778,25 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::accept_curator`]."] + #[doc = "Accept the curator role for the child-bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the curator of this"] + #[doc = "child-bounty."] + #[doc = ""] + #[doc = "A deposit will be reserved from the curator and refund upon"] + #[doc = "successful payout or cancellation."] + #[doc = ""] + #[doc = "Fee for curator is deducted from curator fee of parent bounty."] + #[doc = ""] + #[doc = "Parent bounty must be in active state, for this child-bounty call to"] + #[doc = "work."] + #[doc = ""] + #[doc = "Child-bounty must be in \"CuratorProposed\" state, for processing the"] + #[doc = "call. And state of child-bounty is moved to \"Active\" on successful"] + #[doc = "call completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] pub struct AcceptCurator { #[codec(compact)] pub parent_bounty_id: accept_curator::ParentBountyId, @@ -24902,7 +27822,40 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::unassign_curator`]."] + #[doc = "Unassign curator from a child-bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call can be either `RejectOrigin`, or"] + #[doc = "the curator of the parent bounty, or any signed origin."] + #[doc = ""] + #[doc = "For the origin other than T::RejectOrigin and the child-bounty"] + #[doc = "curator, parent bounty must be in active state, for this call to"] + #[doc = "work. We allow child-bounty curator and T::RejectOrigin to execute"] + #[doc = "this call irrespective of the parent bounty state."] + #[doc = ""] + #[doc = "If this function is called by the `RejectOrigin` or the"] + #[doc = "parent bounty curator, we assume that the child-bounty curator is"] + #[doc = "malicious or inactive. As a result, child-bounty curator deposit is"] + #[doc = "slashed."] + #[doc = ""] + #[doc = "If the origin is the child-bounty curator, we take this as a sign"] + #[doc = "that they are unable to do their job, and are willingly giving up."] + #[doc = "We could slash the deposit, but for now we allow them to unreserve"] + #[doc = "their deposit and exit without issue. (We may want to change this if"] + #[doc = "it is abused.)"] + #[doc = ""] + #[doc = "Finally, the origin can be anyone iff the child-bounty curator is"] + #[doc = "\"inactive\". Expiry update due of parent bounty is used to estimate"] + #[doc = "inactive state of child-bounty curator."] + #[doc = ""] + #[doc = "This allows anyone in the community to call out that a child-bounty"] + #[doc = "curator is not doing their due diligence, and we should pick a new"] + #[doc = "one. In this case the child-bounty curator deposit is slashed."] + #[doc = ""] + #[doc = "State of child-bounty is moved to Added state on successful call"] + #[doc = "completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] pub struct UnassignCurator { #[codec(compact)] pub parent_bounty_id: unassign_curator::ParentBountyId, @@ -24928,7 +27881,23 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::award_child_bounty`]."] + #[doc = "Award child-bounty to a beneficiary."] + #[doc = ""] + #[doc = "The beneficiary will be able to claim the funds after a delay."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the parent curator or"] + #[doc = "curator of this child-bounty."] + #[doc = ""] + #[doc = "Parent bounty must be in active state, for this child-bounty call to"] + #[doc = "work."] + #[doc = ""] + #[doc = "Child-bounty must be in active state, for processing the call. And"] + #[doc = "state of child-bounty is moved to \"PendingPayout\" on successful call"] + #[doc = "completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] + #[doc = "- `beneficiary`: Beneficiary account."] pub struct AwardChildBounty { #[codec(compact)] pub parent_bounty_id: award_child_bounty::ParentBountyId, @@ -24957,7 +27926,22 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::claim_child_bounty`]."] + #[doc = "Claim the payout from an awarded child-bounty after payout delay."] + #[doc = ""] + #[doc = "The dispatch origin for this call may be any signed origin."] + #[doc = ""] + #[doc = "Call works independent of parent bounty state, No need for parent"] + #[doc = "bounty to be in active state."] + #[doc = ""] + #[doc = "The Beneficiary is paid out with agreed bounty value. Curator fee is"] + #[doc = "paid & curator deposit is unreserved."] + #[doc = ""] + #[doc = "Child-bounty must be in \"PendingPayout\" state, for processing the"] + #[doc = "call. And instance of child-bounty is removed from the state on"] + #[doc = "successful call completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] pub struct ClaimChildBounty { #[codec(compact)] pub parent_bounty_id: claim_child_bounty::ParentBountyId, @@ -24983,7 +27967,28 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::close_child_bounty`]."] + #[doc = "Cancel a proposed or active child-bounty. Child-bounty account funds"] + #[doc = "are transferred to parent bounty account. The child-bounty curator"] + #[doc = "deposit may be unreserved if possible."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be either parent curator or"] + #[doc = "`T::RejectOrigin`."] + #[doc = ""] + #[doc = "If the state of child-bounty is `Active`, curator deposit is"] + #[doc = "unreserved."] + #[doc = ""] + #[doc = "If the state of child-bounty is `PendingPayout`, call fails &"] + #[doc = "returns `PendingPayout` error."] + #[doc = ""] + #[doc = "For the origin other than T::RejectOrigin, parent bounty must be in"] + #[doc = "active state, for this child-bounty call to work. For origin"] + #[doc = "T::RejectOrigin execution is forced."] + #[doc = ""] + #[doc = "Instance of child-bounty is removed from the state on successful"] + #[doc = "call completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] pub struct CloseChildBounty { #[codec(compact)] pub parent_bounty_id: close_child_bounty::ParentBountyId, @@ -25002,7 +28007,25 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::add_child_bounty`]."] + #[doc = "Add a new child-bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the curator of parent"] + #[doc = "bounty and the parent bounty must be in \"active\" state."] + #[doc = ""] + #[doc = "Child-bounty gets added successfully & fund gets transferred from"] + #[doc = "parent bounty to child-bounty account, if parent bounty has enough"] + #[doc = "funds, else the call fails."] + #[doc = ""] + #[doc = "Upper bound to maximum number of active child bounties that can be"] + #[doc = "added are managed via runtime trait config"] + #[doc = "[`Config::MaxActiveChildBountyCount`]."] + #[doc = ""] + #[doc = "If the call is success, the status of child-bounty is updated to"] + #[doc = "\"Added\"."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty for which child-bounty is being added."] + #[doc = "- `value`: Value for executing the proposal."] + #[doc = "- `description`: Text description for the child-bounty."] pub fn add_child_bounty( &self, parent_bounty_id: types::add_child_bounty::ParentBountyId, @@ -25025,7 +28048,21 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::propose_curator`]."] + #[doc = "Propose curator for funded child-bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be curator of parent bounty."] + #[doc = ""] + #[doc = "Parent bounty must be in active state, for this child-bounty call to"] + #[doc = "work."] + #[doc = ""] + #[doc = "Child-bounty must be in \"Added\" state, for processing the call. And"] + #[doc = "state of child-bounty is moved to \"CuratorProposed\" on successful"] + #[doc = "call completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] + #[doc = "- `curator`: Address of child-bounty curator."] + #[doc = "- `fee`: payment fee to child-bounty curator for execution."] pub fn propose_curator( &self, parent_bounty_id: types::propose_curator::ParentBountyId, @@ -25049,7 +28086,25 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::accept_curator`]."] + #[doc = "Accept the curator role for the child-bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the curator of this"] + #[doc = "child-bounty."] + #[doc = ""] + #[doc = "A deposit will be reserved from the curator and refund upon"] + #[doc = "successful payout or cancellation."] + #[doc = ""] + #[doc = "Fee for curator is deducted from curator fee of parent bounty."] + #[doc = ""] + #[doc = "Parent bounty must be in active state, for this child-bounty call to"] + #[doc = "work."] + #[doc = ""] + #[doc = "Child-bounty must be in \"CuratorProposed\" state, for processing the"] + #[doc = "call. And state of child-bounty is moved to \"Active\" on successful"] + #[doc = "call completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] pub fn accept_curator( &self, parent_bounty_id: types::accept_curator::ParentBountyId, @@ -25070,7 +28125,40 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::unassign_curator`]."] + #[doc = "Unassign curator from a child-bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call can be either `RejectOrigin`, or"] + #[doc = "the curator of the parent bounty, or any signed origin."] + #[doc = ""] + #[doc = "For the origin other than T::RejectOrigin and the child-bounty"] + #[doc = "curator, parent bounty must be in active state, for this call to"] + #[doc = "work. We allow child-bounty curator and T::RejectOrigin to execute"] + #[doc = "this call irrespective of the parent bounty state."] + #[doc = ""] + #[doc = "If this function is called by the `RejectOrigin` or the"] + #[doc = "parent bounty curator, we assume that the child-bounty curator is"] + #[doc = "malicious or inactive. As a result, child-bounty curator deposit is"] + #[doc = "slashed."] + #[doc = ""] + #[doc = "If the origin is the child-bounty curator, we take this as a sign"] + #[doc = "that they are unable to do their job, and are willingly giving up."] + #[doc = "We could slash the deposit, but for now we allow them to unreserve"] + #[doc = "their deposit and exit without issue. (We may want to change this if"] + #[doc = "it is abused.)"] + #[doc = ""] + #[doc = "Finally, the origin can be anyone iff the child-bounty curator is"] + #[doc = "\"inactive\". Expiry update due of parent bounty is used to estimate"] + #[doc = "inactive state of child-bounty curator."] + #[doc = ""] + #[doc = "This allows anyone in the community to call out that a child-bounty"] + #[doc = "curator is not doing their due diligence, and we should pick a new"] + #[doc = "one. In this case the child-bounty curator deposit is slashed."] + #[doc = ""] + #[doc = "State of child-bounty is moved to Added state on successful call"] + #[doc = "completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] pub fn unassign_curator( &self, parent_bounty_id: types::unassign_curator::ParentBountyId, @@ -25091,7 +28179,23 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::award_child_bounty`]."] + #[doc = "Award child-bounty to a beneficiary."] + #[doc = ""] + #[doc = "The beneficiary will be able to claim the funds after a delay."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the parent curator or"] + #[doc = "curator of this child-bounty."] + #[doc = ""] + #[doc = "Parent bounty must be in active state, for this child-bounty call to"] + #[doc = "work."] + #[doc = ""] + #[doc = "Child-bounty must be in active state, for processing the call. And"] + #[doc = "state of child-bounty is moved to \"PendingPayout\" on successful call"] + #[doc = "completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] + #[doc = "- `beneficiary`: Beneficiary account."] pub fn award_child_bounty( &self, parent_bounty_id: types::award_child_bounty::ParentBountyId, @@ -25113,7 +28217,22 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::claim_child_bounty`]."] + #[doc = "Claim the payout from an awarded child-bounty after payout delay."] + #[doc = ""] + #[doc = "The dispatch origin for this call may be any signed origin."] + #[doc = ""] + #[doc = "Call works independent of parent bounty state, No need for parent"] + #[doc = "bounty to be in active state."] + #[doc = ""] + #[doc = "The Beneficiary is paid out with agreed bounty value. Curator fee is"] + #[doc = "paid & curator deposit is unreserved."] + #[doc = ""] + #[doc = "Child-bounty must be in \"PendingPayout\" state, for processing the"] + #[doc = "call. And instance of child-bounty is removed from the state on"] + #[doc = "successful call completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] pub fn claim_child_bounty( &self, parent_bounty_id: types::claim_child_bounty::ParentBountyId, @@ -25133,7 +28252,28 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::close_child_bounty`]."] + #[doc = "Cancel a proposed or active child-bounty. Child-bounty account funds"] + #[doc = "are transferred to parent bounty account. The child-bounty curator"] + #[doc = "deposit may be unreserved if possible."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be either parent curator or"] + #[doc = "`T::RejectOrigin`."] + #[doc = ""] + #[doc = "If the state of child-bounty is `Active`, curator deposit is"] + #[doc = "unreserved."] + #[doc = ""] + #[doc = "If the state of child-bounty is `PendingPayout`, call fails &"] + #[doc = "returns `PendingPayout` error."] + #[doc = ""] + #[doc = "For the origin other than T::RejectOrigin, parent bounty must be in"] + #[doc = "active state, for this child-bounty call to work. For origin"] + #[doc = "T::RejectOrigin execution is forced."] + #[doc = ""] + #[doc = "Instance of child-bounty is removed from the state on successful"] + #[doc = "call completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] pub fn close_child_bounty( &self, parent_bounty_id: types::close_child_bounty::ParentBountyId, @@ -25305,7 +28445,7 @@ pub mod api { pub fn child_bounty_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::child_bounty_count::ChildBountyCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -25314,7 +28454,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ChildBounties", "ChildBountyCount", - vec![], + (), [ 206u8, 1u8, 40u8, 132u8, 51u8, 139u8, 234u8, 20u8, 89u8, 86u8, 247u8, 107u8, 169u8, 252u8, 5u8, 180u8, 218u8, 24u8, 232u8, 94u8, 82u8, 135u8, @@ -25327,7 +28467,7 @@ pub mod api { pub fn parent_child_bounties_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::parent_child_bounties::ParentChildBounties, (), ::subxt::storage::address::Yes, @@ -25336,7 +28476,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ChildBounties", "ParentChildBounties", - vec![], + (), [ 52u8, 179u8, 242u8, 212u8, 91u8, 185u8, 176u8, 52u8, 100u8, 200u8, 1u8, 41u8, 184u8, 234u8, 234u8, 8u8, 123u8, 252u8, 131u8, 55u8, 109u8, @@ -25350,7 +28490,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::parent_child_bounties::Param0, + >, types::parent_child_bounties::ParentChildBounties, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -25359,9 +28501,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ChildBounties", "ParentChildBounties", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 52u8, 179u8, 242u8, 212u8, 91u8, 185u8, 176u8, 52u8, 100u8, 200u8, 1u8, 41u8, 184u8, 234u8, 234u8, 8u8, 123u8, 252u8, 131u8, 55u8, 109u8, @@ -25373,7 +28513,7 @@ pub mod api { pub fn child_bounties_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::child_bounties::ChildBounties, (), (), @@ -25382,7 +28522,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ChildBounties", "ChildBounties", - vec![], + (), [ 165u8, 240u8, 158u8, 204u8, 183u8, 190u8, 129u8, 65u8, 226u8, 8u8, 182u8, 103u8, 46u8, 162u8, 35u8, 155u8, 131u8, 45u8, 163u8, 64u8, @@ -25396,7 +28536,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::child_bounties::ChildBounties, (), (), @@ -25405,9 +28545,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ChildBounties", "ChildBounties", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 165u8, 240u8, 158u8, 204u8, 183u8, 190u8, 129u8, 65u8, 226u8, 8u8, 182u8, 103u8, 46u8, 162u8, 35u8, 155u8, 131u8, 45u8, 163u8, 64u8, @@ -25422,7 +28560,10 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey, + ::subxt::storage::address::StaticStorageKey, + ), types::child_bounties::ChildBounties, ::subxt::storage::address::Yes, (), @@ -25431,10 +28572,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ChildBounties", "ChildBounties", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 165u8, 240u8, 158u8, 204u8, 183u8, 190u8, 129u8, 65u8, 226u8, 8u8, 182u8, 103u8, 46u8, 162u8, 35u8, 155u8, 131u8, 45u8, 163u8, 64u8, @@ -25447,7 +28588,7 @@ pub mod api { pub fn child_bounty_descriptions_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::child_bounty_descriptions::ChildBountyDescriptions, (), (), @@ -25456,7 +28597,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ChildBounties", "ChildBountyDescriptions", - vec![], + (), [ 192u8, 0u8, 220u8, 156u8, 109u8, 65u8, 113u8, 102u8, 119u8, 0u8, 109u8, 141u8, 211u8, 128u8, 237u8, 61u8, 28u8, 56u8, 206u8, 93u8, 183u8, 74u8, @@ -25469,7 +28610,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::child_bounty_descriptions::Param0, + >, types::child_bounty_descriptions::ChildBountyDescriptions, ::subxt::storage::address::Yes, (), @@ -25478,9 +28621,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ChildBounties", "ChildBountyDescriptions", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 192u8, 0u8, 220u8, 156u8, 109u8, 65u8, 113u8, 102u8, 119u8, 0u8, 109u8, 141u8, 211u8, 128u8, 237u8, 61u8, 28u8, 56u8, 206u8, 93u8, 183u8, 74u8, @@ -25492,7 +28633,7 @@ pub mod api { pub fn children_curator_fees_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::children_curator_fees::ChildrenCuratorFees, (), ::subxt::storage::address::Yes, @@ -25501,7 +28642,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ChildBounties", "ChildrenCuratorFees", - vec![], + (), [ 32u8, 16u8, 190u8, 193u8, 6u8, 80u8, 163u8, 16u8, 85u8, 111u8, 39u8, 141u8, 209u8, 70u8, 213u8, 167u8, 22u8, 12u8, 93u8, 17u8, 104u8, 94u8, @@ -25514,7 +28655,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::children_curator_fees::Param0, + >, types::children_curator_fees::ChildrenCuratorFees, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -25523,9 +28666,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ChildBounties", "ChildrenCuratorFees", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 32u8, 16u8, 190u8, 193u8, 6u8, 80u8, 163u8, 16u8, 85u8, 111u8, 39u8, 141u8, 209u8, 70u8, 213u8, 167u8, 22u8, 12u8, 93u8, 17u8, 104u8, 94u8, @@ -25594,7 +28735,17 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::place_bid`]."] + #[doc = "Place a bid."] + #[doc = ""] + #[doc = "Origin must be Signed, and account must have at least `amount` in free balance."] + #[doc = ""] + #[doc = "- `amount`: The amount of the bid; these funds will be reserved, and if/when"] + #[doc = " consolidated, removed. Must be at least `MinBid`."] + #[doc = "- `duration`: The number of periods before which the newly consolidated bid may be"] + #[doc = " thawed. Must be greater than 1 and no more than `QueueCount`."] + #[doc = ""] + #[doc = "Complexities:"] + #[doc = "- `Queues[duration].len()` (just take max)."] pub struct PlaceBid { #[codec(compact)] pub amount: place_bid::Amount, @@ -25619,7 +28770,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::retract_bid`]."] + #[doc = "Retract a previously placed bid."] + #[doc = ""] + #[doc = "Origin must be Signed, and the account should have previously issued a still-active bid"] + #[doc = "of `amount` for `duration`."] + #[doc = ""] + #[doc = "- `amount`: The amount of the previous bid."] + #[doc = "- `duration`: The duration of the previous bid."] pub struct RetractBid { #[codec(compact)] pub amount: retract_bid::Amount, @@ -25644,7 +28801,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::fund_deficit`]."] + #[doc = "Ensure we have sufficient funding for all potential payouts."] + #[doc = ""] + #[doc = "- `origin`: Must be accepted by `FundOrigin`."] pub struct FundDeficit; impl ::subxt::blocks::StaticExtrinsic for FundDeficit { const PALLET: &'static str = "Nis"; @@ -25660,7 +28819,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::thaw_private`]."] + #[doc = "Reduce or remove an outstanding receipt, placing the according proportion of funds into"] + #[doc = "the account of the owner."] + #[doc = ""] + #[doc = "- `origin`: Must be Signed and the account must be the owner of the receipt `index` as"] + #[doc = " well as any fungible counterpart."] + #[doc = "- `index`: The index of the receipt."] + #[doc = "- `portion`: If `Some`, then only the given portion of the receipt should be thawed. If"] + #[doc = " `None`, then all of it should be."] pub struct ThawPrivate { #[codec(compact)] pub index: thaw_private::Index, @@ -25687,7 +28853,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::thaw_communal`]."] + #[doc = "Reduce or remove an outstanding receipt, placing the according proportion of funds into"] + #[doc = "the account of the owner."] + #[doc = ""] + #[doc = "- `origin`: Must be Signed and the account must be the owner of the fungible counterpart"] + #[doc = " for receipt `index`."] + #[doc = "- `index`: The index of the receipt."] pub struct ThawCommunal { #[codec(compact)] pub index: thaw_communal::Index, @@ -25710,7 +28881,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::communify`]."] + #[doc = "Make a private receipt communal and create fungible counterparts for its owner."] pub struct Communify { #[codec(compact)] pub index: communify::Index, @@ -25733,7 +28904,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::privatize`]."] + #[doc = "Make a communal receipt private and burn fungible counterparts from its owner."] pub struct Privatize { #[codec(compact)] pub index: privatize::Index, @@ -25749,7 +28920,17 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::place_bid`]."] + #[doc = "Place a bid."] + #[doc = ""] + #[doc = "Origin must be Signed, and account must have at least `amount` in free balance."] + #[doc = ""] + #[doc = "- `amount`: The amount of the bid; these funds will be reserved, and if/when"] + #[doc = " consolidated, removed. Must be at least `MinBid`."] + #[doc = "- `duration`: The number of periods before which the newly consolidated bid may be"] + #[doc = " thawed. Must be greater than 1 and no more than `QueueCount`."] + #[doc = ""] + #[doc = "Complexities:"] + #[doc = "- `Queues[duration].len()` (just take max)."] pub fn place_bid( &self, amount: types::place_bid::Amount, @@ -25767,7 +28948,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::retract_bid`]."] + #[doc = "Retract a previously placed bid."] + #[doc = ""] + #[doc = "Origin must be Signed, and the account should have previously issued a still-active bid"] + #[doc = "of `amount` for `duration`."] + #[doc = ""] + #[doc = "- `amount`: The amount of the previous bid."] + #[doc = "- `duration`: The duration of the previous bid."] pub fn retract_bid( &self, amount: types::retract_bid::Amount, @@ -25784,7 +28971,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::fund_deficit`]."] + #[doc = "Ensure we have sufficient funding for all potential payouts."] + #[doc = ""] + #[doc = "- `origin`: Must be accepted by `FundOrigin`."] pub fn fund_deficit(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Nis", @@ -25798,7 +28987,14 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::thaw_private`]."] + #[doc = "Reduce or remove an outstanding receipt, placing the according proportion of funds into"] + #[doc = "the account of the owner."] + #[doc = ""] + #[doc = "- `origin`: Must be Signed and the account must be the owner of the receipt `index` as"] + #[doc = " well as any fungible counterpart."] + #[doc = "- `index`: The index of the receipt."] + #[doc = "- `portion`: If `Some`, then only the given portion of the receipt should be thawed. If"] + #[doc = " `None`, then all of it should be."] pub fn thaw_private( &self, index: types::thaw_private::Index, @@ -25818,7 +29014,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::thaw_communal`]."] + #[doc = "Reduce or remove an outstanding receipt, placing the according proportion of funds into"] + #[doc = "the account of the owner."] + #[doc = ""] + #[doc = "- `origin`: Must be Signed and the account must be the owner of the fungible counterpart"] + #[doc = " for receipt `index`."] + #[doc = "- `index`: The index of the receipt."] pub fn thaw_communal( &self, index: types::thaw_communal::Index, @@ -25835,7 +29036,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::communify`]."] + #[doc = "Make a private receipt communal and create fungible counterparts for its owner."] pub fn communify( &self, index: types::communify::Index, @@ -25852,7 +29053,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::privatize`]."] + #[doc = "Make a communal receipt private and burn fungible counterparts from its owner."] pub fn privatize( &self, index: types::privatize::Index, @@ -26111,7 +29312,7 @@ pub mod api { pub fn queue_totals( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::queue_totals::QueueTotals, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -26120,7 +29321,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Nis", "QueueTotals", - vec![], + (), [ 40u8, 120u8, 43u8, 203u8, 97u8, 129u8, 61u8, 184u8, 137u8, 45u8, 201u8, 90u8, 227u8, 161u8, 52u8, 179u8, 9u8, 74u8, 104u8, 225u8, 209u8, 62u8, @@ -26132,7 +29333,7 @@ pub mod api { pub fn queues_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::queues::Queues, (), ::subxt::storage::address::Yes, @@ -26141,7 +29342,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Nis", "Queues", - vec![], + (), [ 144u8, 181u8, 173u8, 134u8, 6u8, 165u8, 174u8, 91u8, 75u8, 241u8, 142u8, 192u8, 246u8, 71u8, 132u8, 146u8, 181u8, 158u8, 125u8, 34u8, @@ -26155,7 +29356,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::queues::Queues, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -26164,9 +29365,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Nis", "Queues", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 144u8, 181u8, 173u8, 134u8, 6u8, 165u8, 174u8, 91u8, 75u8, 241u8, 142u8, 192u8, 246u8, 71u8, 132u8, 146u8, 181u8, 158u8, 125u8, 34u8, @@ -26179,7 +29378,7 @@ pub mod api { pub fn summary( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::summary::Summary, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -26188,7 +29387,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Nis", "Summary", - vec![], + (), [ 106u8, 21u8, 103u8, 47u8, 211u8, 234u8, 50u8, 222u8, 25u8, 209u8, 67u8, 117u8, 111u8, 6u8, 231u8, 245u8, 109u8, 52u8, 177u8, 20u8, 179u8, @@ -26201,7 +29400,7 @@ pub mod api { pub fn receipts_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::receipts::Receipts, (), (), @@ -26210,7 +29409,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Nis", "Receipts", - vec![], + (), [ 123u8, 179u8, 0u8, 14u8, 5u8, 132u8, 165u8, 192u8, 163u8, 22u8, 174u8, 22u8, 252u8, 44u8, 167u8, 22u8, 116u8, 170u8, 186u8, 118u8, 131u8, 5u8, @@ -26223,7 +29422,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::receipts::Receipts, ::subxt::storage::address::Yes, (), @@ -26232,9 +29431,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Nis", "Receipts", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 123u8, 179u8, 0u8, 14u8, 5u8, 132u8, 165u8, 192u8, 163u8, 22u8, 174u8, 22u8, 252u8, 44u8, 167u8, 22u8, 116u8, 170u8, 186u8, 118u8, 131u8, 5u8, @@ -26436,7 +29633,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::transfer_allow_death`]."] + #[doc = "Transfer some liquid free balance to another account."] + #[doc = ""] + #[doc = "`transfer_allow_death` will set the `FreeBalance` of the sender and receiver."] + #[doc = "If the sender's account is below the existential deposit as a result"] + #[doc = "of the transfer, the account will be reaped."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be `Signed` by the transactor."] pub struct TransferAllowDeath { pub dest: transfer_allow_death::Dest, #[codec(compact)] @@ -26461,7 +29664,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_transfer`]."] + #[doc = "Exactly as `transfer_allow_death`, except the origin must be root and the source account"] + #[doc = "may be specified."] pub struct ForceTransfer { pub source: force_transfer::Source, pub dest: force_transfer::Dest, @@ -26488,7 +29692,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::transfer_keep_alive`]."] + #[doc = "Same as the [`transfer_allow_death`] call, but with a check that the transfer will not"] + #[doc = "kill the origin account."] + #[doc = ""] + #[doc = "99% of the time you want [`transfer_allow_death`] instead."] + #[doc = ""] + #[doc = "[`transfer_allow_death`]: struct.Pallet.html#method.transfer"] pub struct TransferKeepAlive { pub dest: transfer_keep_alive::Dest, #[codec(compact)] @@ -26513,7 +29722,21 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::transfer_all`]."] + #[doc = "Transfer the entire transferable balance from the caller account."] + #[doc = ""] + #[doc = "NOTE: This function only attempts to transfer _transferable_ balances. This means that"] + #[doc = "any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be"] + #[doc = "transferred by this function. To ensure that this function results in a killed account,"] + #[doc = "you might need to prepare the account by removing any reference counters, storage"] + #[doc = "deposits, etc..."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be Signed."] + #[doc = ""] + #[doc = "- `dest`: The recipient of the transfer."] + #[doc = "- `keep_alive`: A boolean to determine if the `transfer_all` operation should send all"] + #[doc = " of the funds the account has, causing the sender account to be killed (false), or"] + #[doc = " transfer everything except at least the existential deposit, which will guarantee to"] + #[doc = " keep the sender account alive (true)."] pub struct TransferAll { pub dest: transfer_all::Dest, pub keep_alive: transfer_all::KeepAlive, @@ -26537,7 +29760,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_unreserve`]."] + #[doc = "Unreserve some balance from a user by force."] + #[doc = ""] + #[doc = "Can only be called by ROOT."] pub struct ForceUnreserve { pub who: force_unreserve::Who, pub amount: force_unreserve::Amount, @@ -26561,7 +29786,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::upgrade_accounts`]."] + #[doc = "Upgrade a specified account."] + #[doc = ""] + #[doc = "- `origin`: Must be `Signed`."] + #[doc = "- `who`: The account to be upgraded."] + #[doc = ""] + #[doc = "This will waive the transaction fee if at least all but 10% of the accounts needed to"] + #[doc = "be upgraded. (We let some not have to be upgraded just in order to allow for the"] + #[doc = "possibililty of churn)."] pub struct UpgradeAccounts { pub who: upgrade_accounts::Who, } @@ -26583,7 +29815,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_set_balance`]."] + #[doc = "Set the regular balance of a given account."] + #[doc = ""] + #[doc = "The dispatch origin for this call is `root`."] pub struct ForceSetBalance { pub who: force_set_balance::Who, #[codec(compact)] @@ -26608,7 +29842,11 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_adjust_total_issuance`]."] + #[doc = "Adjust the total issuance in a saturating way."] + #[doc = ""] + #[doc = "Can only be called by root and always needs a positive `delta`."] + #[doc = ""] + #[doc = "# Example"] pub struct ForceAdjustTotalIssuance { pub direction: force_adjust_total_issuance::Direction, #[codec(compact)] @@ -26626,7 +29864,13 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::transfer_allow_death`]."] + #[doc = "Transfer some liquid free balance to another account."] + #[doc = ""] + #[doc = "`transfer_allow_death` will set the `FreeBalance` of the sender and receiver."] + #[doc = "If the sender's account is below the existential deposit as a result"] + #[doc = "of the transfer, the account will be reaped."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be `Signed` by the transactor."] pub fn transfer_allow_death( &self, dest: types::transfer_allow_death::Dest, @@ -26644,7 +29888,8 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_transfer`]."] + #[doc = "Exactly as `transfer_allow_death`, except the origin must be root and the source account"] + #[doc = "may be specified."] pub fn force_transfer( &self, source: types::force_transfer::Source, @@ -26666,7 +29911,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::transfer_keep_alive`]."] + #[doc = "Same as the [`transfer_allow_death`] call, but with a check that the transfer will not"] + #[doc = "kill the origin account."] + #[doc = ""] + #[doc = "99% of the time you want [`transfer_allow_death`] instead."] + #[doc = ""] + #[doc = "[`transfer_allow_death`]: struct.Pallet.html#method.transfer"] pub fn transfer_keep_alive( &self, dest: types::transfer_keep_alive::Dest, @@ -26683,7 +29933,21 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::transfer_all`]."] + #[doc = "Transfer the entire transferable balance from the caller account."] + #[doc = ""] + #[doc = "NOTE: This function only attempts to transfer _transferable_ balances. This means that"] + #[doc = "any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be"] + #[doc = "transferred by this function. To ensure that this function results in a killed account,"] + #[doc = "you might need to prepare the account by removing any reference counters, storage"] + #[doc = "deposits, etc..."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be Signed."] + #[doc = ""] + #[doc = "- `dest`: The recipient of the transfer."] + #[doc = "- `keep_alive`: A boolean to determine if the `transfer_all` operation should send all"] + #[doc = " of the funds the account has, causing the sender account to be killed (false), or"] + #[doc = " transfer everything except at least the existential deposit, which will guarantee to"] + #[doc = " keep the sender account alive (true)."] pub fn transfer_all( &self, dest: types::transfer_all::Dest, @@ -26700,7 +29964,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_unreserve`]."] + #[doc = "Unreserve some balance from a user by force."] + #[doc = ""] + #[doc = "Can only be called by ROOT."] pub fn force_unreserve( &self, who: types::force_unreserve::Who, @@ -26718,7 +29984,14 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::upgrade_accounts`]."] + #[doc = "Upgrade a specified account."] + #[doc = ""] + #[doc = "- `origin`: Must be `Signed`."] + #[doc = "- `who`: The account to be upgraded."] + #[doc = ""] + #[doc = "This will waive the transaction fee if at least all but 10% of the accounts needed to"] + #[doc = "be upgraded. (We let some not have to be upgraded just in order to allow for the"] + #[doc = "possibililty of churn)."] pub fn upgrade_accounts( &self, who: types::upgrade_accounts::Who, @@ -26734,7 +30007,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_set_balance`]."] + #[doc = "Set the regular balance of a given account."] + #[doc = ""] + #[doc = "The dispatch origin for this call is `root`."] pub fn force_set_balance( &self, who: types::force_set_balance::Who, @@ -26751,7 +30026,11 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_adjust_total_issuance`]."] + #[doc = "Adjust the total issuance in a saturating way."] + #[doc = ""] + #[doc = "Can only be called by root and always needs a positive `delta`."] + #[doc = ""] + #[doc = "# Example"] pub fn force_adjust_total_issuance( &self, direction: types::force_adjust_total_issuance::Direction, @@ -27372,7 +30651,7 @@ pub mod api { pub fn total_issuance( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::total_issuance::TotalIssuance, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -27381,7 +30660,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "NisCounterpartBalances", "TotalIssuance", - vec![], + (), [ 116u8, 70u8, 119u8, 194u8, 69u8, 37u8, 116u8, 206u8, 171u8, 70u8, 171u8, 210u8, 226u8, 111u8, 184u8, 204u8, 206u8, 11u8, 68u8, 72u8, @@ -27394,7 +30673,7 @@ pub mod api { pub fn inactive_issuance( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::inactive_issuance::InactiveIssuance, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -27403,7 +30682,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "NisCounterpartBalances", "InactiveIssuance", - vec![], + (), [ 212u8, 185u8, 19u8, 50u8, 250u8, 72u8, 173u8, 50u8, 4u8, 104u8, 161u8, 249u8, 77u8, 247u8, 204u8, 248u8, 11u8, 18u8, 57u8, 4u8, 82u8, 110u8, @@ -27438,7 +30717,7 @@ pub mod api { pub fn account_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::account::Account, (), ::subxt::storage::address::Yes, @@ -27447,7 +30726,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "NisCounterpartBalances", "Account", - vec![], + (), [ 213u8, 38u8, 200u8, 69u8, 218u8, 0u8, 112u8, 181u8, 160u8, 23u8, 96u8, 90u8, 3u8, 88u8, 126u8, 22u8, 103u8, 74u8, 64u8, 69u8, 29u8, 247u8, @@ -27483,7 +30762,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::account::Account, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -27492,9 +30771,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "NisCounterpartBalances", "Account", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 213u8, 38u8, 200u8, 69u8, 218u8, 0u8, 112u8, 181u8, 160u8, 23u8, 96u8, 90u8, 3u8, 88u8, 126u8, 22u8, 103u8, 74u8, 64u8, 69u8, 29u8, 247u8, @@ -27507,7 +30784,7 @@ pub mod api { pub fn locks_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::locks::Locks, (), ::subxt::storage::address::Yes, @@ -27516,7 +30793,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "NisCounterpartBalances", "Locks", - vec![], + (), [ 10u8, 223u8, 55u8, 0u8, 249u8, 69u8, 168u8, 41u8, 75u8, 35u8, 120u8, 167u8, 18u8, 132u8, 9u8, 20u8, 91u8, 51u8, 27u8, 69u8, 136u8, 187u8, @@ -27530,7 +30807,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::locks::Locks, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -27539,9 +30816,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "NisCounterpartBalances", "Locks", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 10u8, 223u8, 55u8, 0u8, 249u8, 69u8, 168u8, 41u8, 75u8, 35u8, 120u8, 167u8, 18u8, 132u8, 9u8, 20u8, 91u8, 51u8, 27u8, 69u8, 136u8, 187u8, @@ -27553,7 +30828,7 @@ pub mod api { pub fn reserves_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::reserves::Reserves, (), ::subxt::storage::address::Yes, @@ -27562,7 +30837,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "NisCounterpartBalances", "Reserves", - vec![], + (), [ 112u8, 10u8, 241u8, 77u8, 64u8, 187u8, 106u8, 159u8, 13u8, 153u8, 140u8, 178u8, 182u8, 50u8, 1u8, 55u8, 149u8, 92u8, 196u8, 229u8, 170u8, @@ -27575,7 +30850,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::reserves::Reserves, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -27584,9 +30859,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "NisCounterpartBalances", "Reserves", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 112u8, 10u8, 241u8, 77u8, 64u8, 187u8, 106u8, 159u8, 13u8, 153u8, 140u8, 178u8, 182u8, 50u8, 1u8, 55u8, 149u8, 92u8, 196u8, 229u8, 170u8, @@ -27598,7 +30871,7 @@ pub mod api { pub fn holds_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::holds::Holds, (), ::subxt::storage::address::Yes, @@ -27607,7 +30880,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "NisCounterpartBalances", "Holds", - vec![], + (), [ 181u8, 39u8, 29u8, 45u8, 45u8, 198u8, 129u8, 210u8, 189u8, 183u8, 121u8, 125u8, 57u8, 90u8, 95u8, 107u8, 51u8, 13u8, 22u8, 105u8, 191u8, @@ -27621,7 +30894,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::holds::Holds, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -27630,9 +30903,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "NisCounterpartBalances", "Holds", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 181u8, 39u8, 29u8, 45u8, 45u8, 198u8, 129u8, 210u8, 189u8, 183u8, 121u8, 125u8, 57u8, 90u8, 95u8, 107u8, 51u8, 13u8, 22u8, 105u8, 191u8, @@ -27645,7 +30916,7 @@ pub mod api { pub fn freezes_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::freezes::Freezes, (), ::subxt::storage::address::Yes, @@ -27654,7 +30925,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "NisCounterpartBalances", "Freezes", - vec![], + (), [ 69u8, 49u8, 165u8, 76u8, 135u8, 142u8, 179u8, 118u8, 50u8, 109u8, 53u8, 112u8, 110u8, 94u8, 30u8, 93u8, 173u8, 38u8, 27u8, 142u8, 19u8, 5u8, @@ -27667,7 +30938,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::freezes::Freezes, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -27676,9 +30947,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "NisCounterpartBalances", "Freezes", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 69u8, 49u8, 165u8, 76u8, 135u8, 142u8, 179u8, 118u8, 50u8, 109u8, 53u8, 112u8, 110u8, 94u8, 30u8, 93u8, 173u8, 38u8, 27u8, 142u8, 19u8, 5u8, @@ -27783,7 +31052,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_validation_upgrade_cooldown`]."] + #[doc = "Set the validation upgrade cooldown."] pub struct SetValidationUpgradeCooldown { pub new: set_validation_upgrade_cooldown::New, } @@ -27805,7 +31074,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_validation_upgrade_delay`]."] + #[doc = "Set the validation upgrade delay."] pub struct SetValidationUpgradeDelay { pub new: set_validation_upgrade_delay::New, } @@ -27827,7 +31096,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_code_retention_period`]."] + #[doc = "Set the acceptance period for an included candidate."] pub struct SetCodeRetentionPeriod { pub new: set_code_retention_period::New, } @@ -27849,7 +31118,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_max_code_size`]."] + #[doc = "Set the max validation code size for incoming upgrades."] pub struct SetMaxCodeSize { pub new: set_max_code_size::New, } @@ -27871,7 +31140,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_max_pov_size`]."] + #[doc = "Set the max POV block size for incoming upgrades."] pub struct SetMaxPovSize { pub new: set_max_pov_size::New, } @@ -27893,7 +31162,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_max_head_data_size`]."] + #[doc = "Set the max head data size for paras."] pub struct SetMaxHeadDataSize { pub new: set_max_head_data_size::New, } @@ -27915,7 +31184,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_coretime_cores`]."] + #[doc = "Set the number of coretime execution cores."] + #[doc = ""] + #[doc = "Note that this configuration is managed by the coretime chain. Only manually change"] + #[doc = "this, if you really know what you are doing!"] pub struct SetCoretimeCores { pub new: set_coretime_cores::New, } @@ -27937,17 +31209,17 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_on_demand_retries`]."] - pub struct SetOnDemandRetries { - pub new: set_on_demand_retries::New, + #[doc = "Set the max number of times a claim may timeout on a core before it is abandoned"] + pub struct SetMaxAvailabilityTimeouts { + pub new: set_max_availability_timeouts::New, } - pub mod set_on_demand_retries { + pub mod set_max_availability_timeouts { use super::runtime_types; pub type New = ::core::primitive::u32; } - impl ::subxt::blocks::StaticExtrinsic for SetOnDemandRetries { + impl ::subxt::blocks::StaticExtrinsic for SetMaxAvailabilityTimeouts { const PALLET: &'static str = "Configuration"; - const CALL: &'static str = "set_on_demand_retries"; + const CALL: &'static str = "set_max_availability_timeouts"; } #[derive( :: subxt :: ext :: codec :: Decode, @@ -27959,7 +31231,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_group_rotation_frequency`]."] + #[doc = "Set the parachain validator-group rotation frequency"] pub struct SetGroupRotationFrequency { pub new: set_group_rotation_frequency::New, } @@ -27981,7 +31253,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_paras_availability_period`]."] + #[doc = "Set the availability period for paras."] pub struct SetParasAvailabilityPeriod { pub new: set_paras_availability_period::New, } @@ -28003,7 +31275,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_scheduling_lookahead`]."] + #[doc = "Set the scheduling lookahead, in expected number of blocks at peak throughput."] pub struct SetSchedulingLookahead { pub new: set_scheduling_lookahead::New, } @@ -28025,7 +31297,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_max_validators_per_core`]."] + #[doc = "Set the maximum number of validators to assign to any core."] pub struct SetMaxValidatorsPerCore { pub new: set_max_validators_per_core::New, } @@ -28047,7 +31319,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_max_validators`]."] + #[doc = "Set the maximum number of validators to use in parachain consensus."] pub struct SetMaxValidators { pub new: set_max_validators::New, } @@ -28069,7 +31341,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_dispute_period`]."] + #[doc = "Set the dispute period, in number of sessions to keep for disputes."] pub struct SetDisputePeriod { pub new: set_dispute_period::New, } @@ -28091,7 +31363,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_dispute_post_conclusion_acceptance_period`]."] + #[doc = "Set the dispute post conclusion acceptance period."] pub struct SetDisputePostConclusionAcceptancePeriod { pub new: set_dispute_post_conclusion_acceptance_period::New, } @@ -28113,7 +31385,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_no_show_slots`]."] + #[doc = "Set the no show slots, in number of number of consensus slots."] + #[doc = "Must be at least 1."] pub struct SetNoShowSlots { pub new: set_no_show_slots::New, } @@ -28135,7 +31408,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_n_delay_tranches`]."] + #[doc = "Set the total number of delay tranches."] pub struct SetNDelayTranches { pub new: set_n_delay_tranches::New, } @@ -28157,7 +31430,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_zeroth_delay_tranche_width`]."] + #[doc = "Set the zeroth delay tranche width."] pub struct SetZerothDelayTrancheWidth { pub new: set_zeroth_delay_tranche_width::New, } @@ -28179,7 +31452,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_needed_approvals`]."] + #[doc = "Set the number of validators needed to approve a block."] pub struct SetNeededApprovals { pub new: set_needed_approvals::New, } @@ -28201,7 +31474,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_relay_vrf_modulo_samples`]."] + #[doc = "Set the number of samples to do of the `RelayVRFModulo` approval assignment criterion."] pub struct SetRelayVrfModuloSamples { pub new: set_relay_vrf_modulo_samples::New, } @@ -28223,7 +31496,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_max_upward_queue_count`]."] + #[doc = "Sets the maximum items that can present in a upward dispatch queue at once."] pub struct SetMaxUpwardQueueCount { pub new: set_max_upward_queue_count::New, } @@ -28245,7 +31518,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_max_upward_queue_size`]."] + #[doc = "Sets the maximum total size of items that can present in a upward dispatch queue at"] + #[doc = "once."] pub struct SetMaxUpwardQueueSize { pub new: set_max_upward_queue_size::New, } @@ -28267,7 +31541,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_max_downward_message_size`]."] + #[doc = "Set the critical downward message size."] pub struct SetMaxDownwardMessageSize { pub new: set_max_downward_message_size::New, } @@ -28289,7 +31563,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_max_upward_message_size`]."] + #[doc = "Sets the maximum size of an upward message that can be sent by a candidate."] pub struct SetMaxUpwardMessageSize { pub new: set_max_upward_message_size::New, } @@ -28311,7 +31585,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_max_upward_message_num_per_candidate`]."] + #[doc = "Sets the maximum number of messages that a candidate can contain."] pub struct SetMaxUpwardMessageNumPerCandidate { pub new: set_max_upward_message_num_per_candidate::New, } @@ -28333,7 +31607,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_hrmp_open_request_ttl`]."] + #[doc = "Sets the number of sessions after which an HRMP open channel request expires."] pub struct SetHrmpOpenRequestTtl { pub new: set_hrmp_open_request_ttl::New, } @@ -28355,7 +31629,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_hrmp_sender_deposit`]."] + #[doc = "Sets the amount of funds that the sender should provide for opening an HRMP channel."] pub struct SetHrmpSenderDeposit { pub new: set_hrmp_sender_deposit::New, } @@ -28377,7 +31651,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_hrmp_recipient_deposit`]."] + #[doc = "Sets the amount of funds that the recipient should provide for accepting opening an HRMP"] + #[doc = "channel."] pub struct SetHrmpRecipientDeposit { pub new: set_hrmp_recipient_deposit::New, } @@ -28399,7 +31674,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_hrmp_channel_max_capacity`]."] + #[doc = "Sets the maximum number of messages allowed in an HRMP channel at once."] pub struct SetHrmpChannelMaxCapacity { pub new: set_hrmp_channel_max_capacity::New, } @@ -28421,7 +31696,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_hrmp_channel_max_total_size`]."] + #[doc = "Sets the maximum total size of messages in bytes allowed in an HRMP channel at once."] pub struct SetHrmpChannelMaxTotalSize { pub new: set_hrmp_channel_max_total_size::New, } @@ -28443,7 +31718,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_hrmp_max_parachain_inbound_channels`]."] + #[doc = "Sets the maximum number of inbound HRMP channels a parachain is allowed to accept."] pub struct SetHrmpMaxParachainInboundChannels { pub new: set_hrmp_max_parachain_inbound_channels::New, } @@ -28465,7 +31740,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_hrmp_channel_max_message_size`]."] + #[doc = "Sets the maximum size of a message that could ever be put into an HRMP channel."] pub struct SetHrmpChannelMaxMessageSize { pub new: set_hrmp_channel_max_message_size::New, } @@ -28487,7 +31762,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_hrmp_max_parachain_outbound_channels`]."] + #[doc = "Sets the maximum number of outbound HRMP channels a parachain is allowed to open."] pub struct SetHrmpMaxParachainOutboundChannels { pub new: set_hrmp_max_parachain_outbound_channels::New, } @@ -28509,7 +31784,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_hrmp_max_message_num_per_candidate`]."] + #[doc = "Sets the maximum number of outbound HRMP messages can be sent by a candidate."] pub struct SetHrmpMaxMessageNumPerCandidate { pub new: set_hrmp_max_message_num_per_candidate::New, } @@ -28531,7 +31806,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_pvf_voting_ttl`]."] + #[doc = "Set the number of session changes after which a PVF pre-checking voting is rejected."] pub struct SetPvfVotingTtl { pub new: set_pvf_voting_ttl::New, } @@ -28553,7 +31828,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_minimum_validation_upgrade_delay`]."] + #[doc = "Sets the minimum delay between announcing the upgrade block for a parachain until the"] + #[doc = "upgrade taking place."] + #[doc = ""] + #[doc = "See the field documentation for information and constraints for the new value."] pub struct SetMinimumValidationUpgradeDelay { pub new: set_minimum_validation_upgrade_delay::New, } @@ -28575,7 +31853,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_bypass_consistency_check`]."] + #[doc = "Setting this to true will disable consistency checks for the configuration setters."] + #[doc = "Use with caution."] pub struct SetBypassConsistencyCheck { pub new: set_bypass_consistency_check::New, } @@ -28597,7 +31876,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_async_backing_params`]."] + #[doc = "Set the asynchronous backing parameters."] pub struct SetAsyncBackingParams { pub new: set_async_backing_params::New, } @@ -28620,7 +31899,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_executor_params`]."] + #[doc = "Set PVF executor parameters."] pub struct SetExecutorParams { pub new: set_executor_params::New, } @@ -28643,7 +31922,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_on_demand_base_fee`]."] + #[doc = "Set the on demand (parathreads) base fee."] pub struct SetOnDemandBaseFee { pub new: set_on_demand_base_fee::New, } @@ -28665,7 +31944,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_on_demand_fee_variability`]."] + #[doc = "Set the on demand (parathreads) fee variability."] pub struct SetOnDemandFeeVariability { pub new: set_on_demand_fee_variability::New, } @@ -28687,7 +31966,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_on_demand_queue_max_size`]."] + #[doc = "Set the on demand (parathreads) queue max size."] pub struct SetOnDemandQueueMaxSize { pub new: set_on_demand_queue_max_size::New, } @@ -28709,7 +31988,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_on_demand_target_queue_utilization`]."] + #[doc = "Set the on demand (parathreads) fee variability."] pub struct SetOnDemandTargetQueueUtilization { pub new: set_on_demand_target_queue_utilization::New, } @@ -28731,7 +32010,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_on_demand_ttl`]."] + #[doc = "Set the on demand (parathreads) ttl in the claimqueue."] pub struct SetOnDemandTtl { pub new: set_on_demand_ttl::New, } @@ -28753,7 +32032,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_minimum_backing_votes`]."] + #[doc = "Set the minimum backing votes threshold."] pub struct SetMinimumBackingVotes { pub new: set_minimum_backing_votes::New, } @@ -28775,7 +32054,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_node_feature`]."] + #[doc = "Set/Unset a node feature."] pub struct SetNodeFeature { pub index: set_node_feature::Index, pub value: set_node_feature::Value, @@ -28799,7 +32078,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_approval_voting_params`]."] + #[doc = "Set approval-voting-params."] pub struct SetApprovalVotingParams { pub new: set_approval_voting_params::New, } @@ -28812,10 +32091,34 @@ pub mod api { const PALLET: &'static str = "Configuration"; const CALL: &'static str = "set_approval_voting_params"; } + #[derive( + :: subxt :: ext :: codec :: Decode, + :: subxt :: ext :: codec :: Encode, + :: subxt :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + # [codec (crate = :: subxt :: ext :: codec)] + #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] + #[doc = "Set scheduler-params."] + pub struct SetSchedulerParams { + pub new: set_scheduler_params::New, + } + pub mod set_scheduler_params { + use super::runtime_types; + pub type New = runtime_types::polkadot_primitives::vstaging::SchedulerParams< + ::core::primitive::u32, + >; + } + impl ::subxt::blocks::StaticExtrinsic for SetSchedulerParams { + const PALLET: &'static str = "Configuration"; + const CALL: &'static str = "set_scheduler_params"; + } } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::set_validation_upgrade_cooldown`]."] + #[doc = "Set the validation upgrade cooldown."] pub fn set_validation_upgrade_cooldown( &self, new: types::set_validation_upgrade_cooldown::New, @@ -28832,7 +32135,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_validation_upgrade_delay`]."] + #[doc = "Set the validation upgrade delay."] pub fn set_validation_upgrade_delay( &self, new: types::set_validation_upgrade_delay::New, @@ -28848,7 +32151,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_code_retention_period`]."] + #[doc = "Set the acceptance period for an included candidate."] pub fn set_code_retention_period( &self, new: types::set_code_retention_period::New, @@ -28865,7 +32168,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_max_code_size`]."] + #[doc = "Set the max validation code size for incoming upgrades."] pub fn set_max_code_size( &self, new: types::set_max_code_size::New, @@ -28882,7 +32185,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_max_pov_size`]."] + #[doc = "Set the max POV block size for incoming upgrades."] pub fn set_max_pov_size( &self, new: types::set_max_pov_size::New, @@ -28898,7 +32201,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_max_head_data_size`]."] + #[doc = "Set the max head data size for paras."] pub fn set_max_head_data_size( &self, new: types::set_max_head_data_size::New, @@ -28915,7 +32218,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_coretime_cores`]."] + #[doc = "Set the number of coretime execution cores."] + #[doc = ""] + #[doc = "Note that this configuration is managed by the coretime chain. Only manually change"] + #[doc = "this, if you really know what you are doing!"] pub fn set_coretime_cores( &self, new: types::set_coretime_cores::New, @@ -28931,24 +32237,23 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_on_demand_retries`]."] - pub fn set_on_demand_retries( + #[doc = "Set the max number of times a claim may timeout on a core before it is abandoned"] + pub fn set_max_availability_timeouts( &self, - new: types::set_on_demand_retries::New, - ) -> ::subxt::tx::Payload { + new: types::set_max_availability_timeouts::New, + ) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Configuration", - "set_on_demand_retries", - types::SetOnDemandRetries { new }, + "set_max_availability_timeouts", + types::SetMaxAvailabilityTimeouts { new }, [ - 228u8, 78u8, 216u8, 66u8, 17u8, 51u8, 84u8, 14u8, 80u8, 67u8, 24u8, - 138u8, 177u8, 108u8, 203u8, 87u8, 240u8, 125u8, 111u8, 223u8, 216u8, - 212u8, 69u8, 236u8, 216u8, 178u8, 166u8, 145u8, 115u8, 47u8, 147u8, - 235u8, + 53u8, 141u8, 53u8, 9u8, 149u8, 145u8, 48u8, 165u8, 157u8, 2u8, 45u8, + 23u8, 128u8, 233u8, 27u8, 132u8, 189u8, 212u8, 45u8, 187u8, 2u8, 112u8, + 26u8, 88u8, 233u8, 84u8, 148u8, 73u8, 222u8, 208u8, 195u8, 153u8, ], ) } - #[doc = "See [`Pallet::set_group_rotation_frequency`]."] + #[doc = "Set the parachain validator-group rotation frequency"] pub fn set_group_rotation_frequency( &self, new: types::set_group_rotation_frequency::New, @@ -28964,7 +32269,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_paras_availability_period`]."] + #[doc = "Set the availability period for paras."] pub fn set_paras_availability_period( &self, new: types::set_paras_availability_period::New, @@ -28980,7 +32285,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_scheduling_lookahead`]."] + #[doc = "Set the scheduling lookahead, in expected number of blocks at peak throughput."] pub fn set_scheduling_lookahead( &self, new: types::set_scheduling_lookahead::New, @@ -28997,7 +32302,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_max_validators_per_core`]."] + #[doc = "Set the maximum number of validators to assign to any core."] pub fn set_max_validators_per_core( &self, new: types::set_max_validators_per_core::New, @@ -29014,7 +32319,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_max_validators`]."] + #[doc = "Set the maximum number of validators to use in parachain consensus."] pub fn set_max_validators( &self, new: types::set_max_validators::New, @@ -29031,7 +32336,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_dispute_period`]."] + #[doc = "Set the dispute period, in number of sessions to keep for disputes."] pub fn set_dispute_period( &self, new: types::set_dispute_period::New, @@ -29048,7 +32353,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_dispute_post_conclusion_acceptance_period`]."] + #[doc = "Set the dispute post conclusion acceptance period."] pub fn set_dispute_post_conclusion_acceptance_period( &self, new: types::set_dispute_post_conclusion_acceptance_period::New, @@ -29066,7 +32371,8 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_no_show_slots`]."] + #[doc = "Set the no show slots, in number of number of consensus slots."] + #[doc = "Must be at least 1."] pub fn set_no_show_slots( &self, new: types::set_no_show_slots::New, @@ -29082,7 +32388,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_n_delay_tranches`]."] + #[doc = "Set the total number of delay tranches."] pub fn set_n_delay_tranches( &self, new: types::set_n_delay_tranches::New, @@ -29099,7 +32405,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_zeroth_delay_tranche_width`]."] + #[doc = "Set the zeroth delay tranche width."] pub fn set_zeroth_delay_tranche_width( &self, new: types::set_zeroth_delay_tranche_width::New, @@ -29115,7 +32421,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_needed_approvals`]."] + #[doc = "Set the number of validators needed to approve a block."] pub fn set_needed_approvals( &self, new: types::set_needed_approvals::New, @@ -29131,7 +32437,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_relay_vrf_modulo_samples`]."] + #[doc = "Set the number of samples to do of the `RelayVRFModulo` approval assignment criterion."] pub fn set_relay_vrf_modulo_samples( &self, new: types::set_relay_vrf_modulo_samples::New, @@ -29148,7 +32454,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_max_upward_queue_count`]."] + #[doc = "Sets the maximum items that can present in a upward dispatch queue at once."] pub fn set_max_upward_queue_count( &self, new: types::set_max_upward_queue_count::New, @@ -29165,7 +32471,8 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_max_upward_queue_size`]."] + #[doc = "Sets the maximum total size of items that can present in a upward dispatch queue at"] + #[doc = "once."] pub fn set_max_upward_queue_size( &self, new: types::set_max_upward_queue_size::New, @@ -29182,7 +32489,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_max_downward_message_size`]."] + #[doc = "Set the critical downward message size."] pub fn set_max_downward_message_size( &self, new: types::set_max_downward_message_size::New, @@ -29198,7 +32505,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_max_upward_message_size`]."] + #[doc = "Sets the maximum size of an upward message that can be sent by a candidate."] pub fn set_max_upward_message_size( &self, new: types::set_max_upward_message_size::New, @@ -29215,7 +32522,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_max_upward_message_num_per_candidate`]."] + #[doc = "Sets the maximum number of messages that a candidate can contain."] pub fn set_max_upward_message_num_per_candidate( &self, new: types::set_max_upward_message_num_per_candidate::New, @@ -29232,7 +32539,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_hrmp_open_request_ttl`]."] + #[doc = "Sets the number of sessions after which an HRMP open channel request expires."] pub fn set_hrmp_open_request_ttl( &self, new: types::set_hrmp_open_request_ttl::New, @@ -29248,7 +32555,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_hrmp_sender_deposit`]."] + #[doc = "Sets the amount of funds that the sender should provide for opening an HRMP channel."] pub fn set_hrmp_sender_deposit( &self, new: types::set_hrmp_sender_deposit::New, @@ -29264,7 +32571,8 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_hrmp_recipient_deposit`]."] + #[doc = "Sets the amount of funds that the recipient should provide for accepting opening an HRMP"] + #[doc = "channel."] pub fn set_hrmp_recipient_deposit( &self, new: types::set_hrmp_recipient_deposit::New, @@ -29281,7 +32589,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_hrmp_channel_max_capacity`]."] + #[doc = "Sets the maximum number of messages allowed in an HRMP channel at once."] pub fn set_hrmp_channel_max_capacity( &self, new: types::set_hrmp_channel_max_capacity::New, @@ -29298,7 +32606,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_hrmp_channel_max_total_size`]."] + #[doc = "Sets the maximum total size of messages in bytes allowed in an HRMP channel at once."] pub fn set_hrmp_channel_max_total_size( &self, new: types::set_hrmp_channel_max_total_size::New, @@ -29314,7 +32622,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_hrmp_max_parachain_inbound_channels`]."] + #[doc = "Sets the maximum number of inbound HRMP channels a parachain is allowed to accept."] pub fn set_hrmp_max_parachain_inbound_channels( &self, new: types::set_hrmp_max_parachain_inbound_channels::New, @@ -29331,7 +32639,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_hrmp_channel_max_message_size`]."] + #[doc = "Sets the maximum size of a message that could ever be put into an HRMP channel."] pub fn set_hrmp_channel_max_message_size( &self, new: types::set_hrmp_channel_max_message_size::New, @@ -29348,7 +32656,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_hrmp_max_parachain_outbound_channels`]."] + #[doc = "Sets the maximum number of outbound HRMP channels a parachain is allowed to open."] pub fn set_hrmp_max_parachain_outbound_channels( &self, new: types::set_hrmp_max_parachain_outbound_channels::New, @@ -29365,7 +32673,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_hrmp_max_message_num_per_candidate`]."] + #[doc = "Sets the maximum number of outbound HRMP messages can be sent by a candidate."] pub fn set_hrmp_max_message_num_per_candidate( &self, new: types::set_hrmp_max_message_num_per_candidate::New, @@ -29381,7 +32689,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_pvf_voting_ttl`]."] + #[doc = "Set the number of session changes after which a PVF pre-checking voting is rejected."] pub fn set_pvf_voting_ttl( &self, new: types::set_pvf_voting_ttl::New, @@ -29398,7 +32706,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_minimum_validation_upgrade_delay`]."] + #[doc = "Sets the minimum delay between announcing the upgrade block for a parachain until the"] + #[doc = "upgrade taking place."] + #[doc = ""] + #[doc = "See the field documentation for information and constraints for the new value."] pub fn set_minimum_validation_upgrade_delay( &self, new: types::set_minimum_validation_upgrade_delay::New, @@ -29415,7 +32726,8 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_bypass_consistency_check`]."] + #[doc = "Setting this to true will disable consistency checks for the configuration setters."] + #[doc = "Use with caution."] pub fn set_bypass_consistency_check( &self, new: types::set_bypass_consistency_check::New, @@ -29432,7 +32744,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_async_backing_params`]."] + #[doc = "Set the asynchronous backing parameters."] pub fn set_async_backing_params( &self, new: types::set_async_backing_params::New, @@ -29449,7 +32761,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_executor_params`]."] + #[doc = "Set PVF executor parameters."] pub fn set_executor_params( &self, new: types::set_executor_params::New, @@ -29465,7 +32777,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_on_demand_base_fee`]."] + #[doc = "Set the on demand (parathreads) base fee."] pub fn set_on_demand_base_fee( &self, new: types::set_on_demand_base_fee::New, @@ -29481,7 +32793,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_on_demand_fee_variability`]."] + #[doc = "Set the on demand (parathreads) fee variability."] pub fn set_on_demand_fee_variability( &self, new: types::set_on_demand_fee_variability::New, @@ -29498,7 +32810,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_on_demand_queue_max_size`]."] + #[doc = "Set the on demand (parathreads) queue max size."] pub fn set_on_demand_queue_max_size( &self, new: types::set_on_demand_queue_max_size::New, @@ -29514,7 +32826,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_on_demand_target_queue_utilization`]."] + #[doc = "Set the on demand (parathreads) fee variability."] pub fn set_on_demand_target_queue_utilization( &self, new: types::set_on_demand_target_queue_utilization::New, @@ -29532,7 +32844,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_on_demand_ttl`]."] + #[doc = "Set the on demand (parathreads) ttl in the claimqueue."] pub fn set_on_demand_ttl( &self, new: types::set_on_demand_ttl::New, @@ -29549,7 +32861,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_minimum_backing_votes`]."] + #[doc = "Set the minimum backing votes threshold."] pub fn set_minimum_backing_votes( &self, new: types::set_minimum_backing_votes::New, @@ -29565,7 +32877,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_node_feature`]."] + #[doc = "Set/Unset a node feature."] pub fn set_node_feature( &self, index: types::set_node_feature::Index, @@ -29582,7 +32894,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_approval_voting_params`]."] + #[doc = "Set approval-voting-params."] pub fn set_approval_voting_params( &self, new: types::set_approval_voting_params::New, @@ -29599,6 +32911,22 @@ pub mod api { ], ) } + #[doc = "Set scheduler-params."] + pub fn set_scheduler_params( + &self, + new: types::set_scheduler_params::New, + ) -> ::subxt::tx::Payload { + ::subxt::tx::Payload::new_static( + "Configuration", + "set_scheduler_params", + types::SetSchedulerParams { new }, + [ + 191u8, 87u8, 235u8, 71u8, 143u8, 46u8, 2u8, 88u8, 111u8, 15u8, 251u8, + 230u8, 241u8, 172u8, 183u8, 110u8, 33u8, 26u8, 43u8, 119u8, 74u8, 62u8, + 200u8, 226u8, 83u8, 180u8, 123u8, 132u8, 171u8, 65u8, 30u8, 13u8, + ], + ) + } } } pub mod storage { @@ -29624,7 +32952,7 @@ pub mod api { pub fn active_config( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::active_config::ActiveConfig, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -29633,11 +32961,12 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Configuration", "ActiveConfig", - vec![], + (), [ - 121u8, 69u8, 70u8, 58u8, 91u8, 124u8, 53u8, 11u8, 49u8, 82u8, 119u8, - 36u8, 116u8, 193u8, 238u8, 208u8, 187u8, 148u8, 200u8, 30u8, 174u8, - 195u8, 201u8, 181u8, 40u8, 93u8, 153u8, 220u8, 158u8, 24u8, 153u8, 5u8, + 139u8, 211u8, 123u8, 64u8, 213u8, 119u8, 27u8, 145u8, 140u8, 101u8, + 90u8, 64u8, 218u8, 130u8, 96u8, 66u8, 107u8, 131u8, 85u8, 4u8, 136u8, + 199u8, 248u8, 106u8, 206u8, 16u8, 205u8, 244u8, 67u8, 105u8, 20u8, + 22u8, ], ) } @@ -29651,7 +32980,7 @@ pub mod api { pub fn pending_configs( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::pending_configs::PendingConfigs, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -29660,11 +32989,11 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Configuration", "PendingConfigs", - vec![], + (), [ - 29u8, 220u8, 218u8, 233u8, 222u8, 28u8, 203u8, 86u8, 0u8, 34u8, 78u8, - 157u8, 206u8, 57u8, 211u8, 206u8, 34u8, 22u8, 126u8, 92u8, 13u8, 71u8, - 156u8, 156u8, 121u8, 2u8, 30u8, 72u8, 37u8, 12u8, 88u8, 210u8, + 7u8, 170u8, 38u8, 177u8, 76u8, 75u8, 198u8, 192u8, 247u8, 137u8, 85u8, + 17u8, 74u8, 93u8, 170u8, 177u8, 198u8, 208u8, 183u8, 28u8, 178u8, 5u8, + 39u8, 246u8, 175u8, 78u8, 145u8, 37u8, 212u8, 20u8, 52u8, 110u8, ], ) } @@ -29673,7 +33002,7 @@ pub mod api { pub fn bypass_consistency_check( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::bypass_consistency_check::BypassConsistencyCheck, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -29682,7 +33011,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Configuration", "BypassConsistencyCheck", - vec![], + (), [ 109u8, 201u8, 130u8, 189u8, 167u8, 112u8, 171u8, 180u8, 100u8, 146u8, 23u8, 174u8, 199u8, 230u8, 185u8, 155u8, 178u8, 45u8, 24u8, 66u8, @@ -29739,7 +33068,7 @@ pub mod api { pub fn current_session_index( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::current_session_index::CurrentSessionIndex, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -29748,7 +33077,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasShared", "CurrentSessionIndex", - vec![], + (), [ 250u8, 164u8, 179u8, 84u8, 199u8, 245u8, 116u8, 48u8, 86u8, 127u8, 50u8, 117u8, 236u8, 41u8, 107u8, 238u8, 151u8, 236u8, 68u8, 78u8, @@ -29762,7 +33091,7 @@ pub mod api { pub fn active_validator_indices( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::active_validator_indices::ActiveValidatorIndices, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -29771,7 +33100,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasShared", "ActiveValidatorIndices", - vec![], + (), [ 80u8, 207u8, 217u8, 195u8, 69u8, 151u8, 27u8, 205u8, 227u8, 89u8, 71u8, 180u8, 91u8, 116u8, 82u8, 193u8, 108u8, 115u8, 40u8, 247u8, 160u8, @@ -29784,7 +33113,7 @@ pub mod api { pub fn active_validator_keys( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::active_validator_keys::ActiveValidatorKeys, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -29793,7 +33122,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasShared", "ActiveValidatorKeys", - vec![], + (), [ 155u8, 151u8, 155u8, 8u8, 23u8, 38u8, 91u8, 12u8, 94u8, 69u8, 228u8, 185u8, 14u8, 219u8, 215u8, 98u8, 235u8, 222u8, 157u8, 180u8, 230u8, @@ -29806,7 +33135,7 @@ pub mod api { pub fn allowed_relay_parents( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::allowed_relay_parents::AllowedRelayParents, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -29815,7 +33144,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasShared", "AllowedRelayParents", - vec![], + (), [ 12u8, 170u8, 241u8, 120u8, 39u8, 216u8, 90u8, 37u8, 119u8, 212u8, 161u8, 90u8, 233u8, 124u8, 92u8, 43u8, 212u8, 206u8, 153u8, 103u8, @@ -29990,7 +33319,7 @@ pub mod api { pub fn availability_bitfields_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::availability_bitfields::AvailabilityBitfields, (), (), @@ -29999,7 +33328,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaInclusion", "AvailabilityBitfields", - vec![], + (), [ 163u8, 169u8, 217u8, 160u8, 147u8, 165u8, 186u8, 21u8, 171u8, 177u8, 74u8, 69u8, 55u8, 205u8, 46u8, 13u8, 253u8, 83u8, 55u8, 190u8, 22u8, @@ -30012,7 +33341,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::availability_bitfields::Param0, + >, types::availability_bitfields::AvailabilityBitfields, ::subxt::storage::address::Yes, (), @@ -30021,9 +33352,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaInclusion", "AvailabilityBitfields", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 163u8, 169u8, 217u8, 160u8, 147u8, 165u8, 186u8, 21u8, 171u8, 177u8, 74u8, 69u8, 55u8, 205u8, 46u8, 13u8, 253u8, 83u8, 55u8, 190u8, 22u8, @@ -30035,7 +33364,7 @@ pub mod api { pub fn pending_availability_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::pending_availability::PendingAvailability, (), (), @@ -30044,7 +33373,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaInclusion", "PendingAvailability", - vec![], + (), [ 164u8, 175u8, 34u8, 182u8, 190u8, 147u8, 42u8, 185u8, 162u8, 130u8, 33u8, 159u8, 234u8, 242u8, 90u8, 119u8, 2u8, 195u8, 48u8, 150u8, 135u8, @@ -30057,7 +33386,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::pending_availability::Param0, + >, types::pending_availability::PendingAvailability, ::subxt::storage::address::Yes, (), @@ -30066,9 +33397,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaInclusion", "PendingAvailability", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 164u8, 175u8, 34u8, 182u8, 190u8, 147u8, 42u8, 185u8, 162u8, 130u8, 33u8, 159u8, 234u8, 242u8, 90u8, 119u8, 2u8, 195u8, 48u8, 150u8, 135u8, @@ -30080,7 +33409,7 @@ pub mod api { pub fn pending_availability_commitments_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::pending_availability_commitments::PendingAvailabilityCommitments, (), (), @@ -30089,7 +33418,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaInclusion", "PendingAvailabilityCommitments", - vec![], + (), [ 196u8, 210u8, 210u8, 16u8, 246u8, 105u8, 121u8, 178u8, 5u8, 48u8, 40u8, 183u8, 63u8, 147u8, 48u8, 74u8, 20u8, 83u8, 76u8, 84u8, 41u8, 30u8, @@ -30102,7 +33431,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::pending_availability_commitments::Param0, + >, types::pending_availability_commitments::PendingAvailabilityCommitments, ::subxt::storage::address::Yes, (), @@ -30111,9 +33442,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaInclusion", "PendingAvailabilityCommitments", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 196u8, 210u8, 210u8, 16u8, 246u8, 105u8, 121u8, 178u8, 5u8, 48u8, 40u8, 183u8, 63u8, 147u8, 48u8, 74u8, 20u8, 83u8, 76u8, 84u8, 41u8, 30u8, @@ -30147,7 +33476,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::enter`]."] + #[doc = "Enter the paras inherent. This will process bitfields and backed candidates."] pub struct Enter { pub data: enter::Data, } @@ -30164,7 +33493,7 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::enter`]."] + #[doc = "Enter the paras inherent. This will process bitfields and backed candidates."] pub fn enter( &self, data: types::enter::Data, @@ -30210,7 +33539,7 @@ pub mod api { pub fn included( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::included::Included, ::subxt::storage::address::Yes, (), @@ -30219,7 +33548,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaInherent", "Included", - vec![], + (), [ 108u8, 164u8, 163u8, 34u8, 27u8, 124u8, 202u8, 167u8, 48u8, 130u8, 155u8, 211u8, 148u8, 130u8, 76u8, 16u8, 5u8, 250u8, 211u8, 174u8, 90u8, @@ -30231,7 +33560,7 @@ pub mod api { pub fn on_chain_votes( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::on_chain_votes::OnChainVotes, ::subxt::storage::address::Yes, (), @@ -30240,7 +33569,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaInherent", "OnChainVotes", - vec![], + (), [ 65u8, 20u8, 36u8, 37u8, 239u8, 150u8, 32u8, 78u8, 226u8, 88u8, 80u8, 240u8, 12u8, 156u8, 176u8, 75u8, 231u8, 204u8, 37u8, 24u8, 204u8, @@ -30294,7 +33623,7 @@ pub mod api { pub fn validator_groups( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::validator_groups::ValidatorGroups, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -30303,7 +33632,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaScheduler", "ValidatorGroups", - vec![], + (), [ 129u8, 58u8, 65u8, 112u8, 4u8, 172u8, 167u8, 19u8, 96u8, 154u8, 159u8, 83u8, 94u8, 125u8, 60u8, 43u8, 60u8, 70u8, 1u8, 58u8, 222u8, 31u8, @@ -30311,10 +33640,8 @@ pub mod api { ], ) } - #[doc = " One entry for each availability core. Entries are `None` if the core is not currently"] - #[doc = " occupied. Can be temporarily `Some` if scheduled but not occupied."] - #[doc = " The i'th parachain belongs to the i'th core, with the remaining cores all being"] - #[doc = " parathread-multiplexers."] + #[doc = " One entry for each availability core. The i'th parachain belongs to the i'th core, with the"] + #[doc = " remaining cores all being on demand parachain multiplexers."] #[doc = ""] #[doc = " Bounded by the maximum of either of these two values:"] #[doc = " * The number of parachains and parathread multiplexers"] @@ -30322,7 +33649,7 @@ pub mod api { pub fn availability_cores( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::availability_cores::AvailabilityCores, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -30331,7 +33658,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaScheduler", "AvailabilityCores", - vec![], + (), [ 250u8, 177u8, 44u8, 237u8, 5u8, 116u8, 135u8, 99u8, 136u8, 209u8, 181u8, 145u8, 254u8, 57u8, 42u8, 92u8, 236u8, 67u8, 128u8, 171u8, @@ -30350,7 +33677,7 @@ pub mod api { pub fn session_start_block( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::session_start_block::SessionStartBlock, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -30359,7 +33686,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaScheduler", "SessionStartBlock", - vec![], + (), [ 185u8, 76u8, 120u8, 75u8, 154u8, 31u8, 33u8, 243u8, 16u8, 77u8, 100u8, 249u8, 21u8, 44u8, 199u8, 195u8, 37u8, 9u8, 218u8, 148u8, 222u8, 90u8, @@ -30369,11 +33696,11 @@ pub mod api { } #[doc = " One entry for each availability core. The `VecDeque` represents the assignments to be"] #[doc = " scheduled on that core. The value contained here will not be valid after the end of"] - #[doc = " a block. Runtime APIs should be used to determine scheduled cores/ for the upcoming block."] + #[doc = " a block. Runtime APIs should be used to determine scheduled cores for the upcoming block."] pub fn claim_queue( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::claim_queue::ClaimQueue, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -30382,7 +33709,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaScheduler", "ClaimQueue", - vec![], + (), [ 192u8, 65u8, 227u8, 114u8, 125u8, 169u8, 134u8, 70u8, 201u8, 99u8, 246u8, 23u8, 0u8, 143u8, 163u8, 87u8, 216u8, 1u8, 184u8, 124u8, 23u8, @@ -30417,7 +33744,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_set_current_code`]."] + #[doc = "Set the storage for the parachain validation code immediately."] pub struct ForceSetCurrentCode { pub para: force_set_current_code::Para, pub new_code: force_set_current_code::NewCode, @@ -30442,7 +33769,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_set_current_head`]."] + #[doc = "Set the storage for the current parachain head data immediately."] pub struct ForceSetCurrentHead { pub para: force_set_current_head::Para, pub new_head: force_set_current_head::NewHead, @@ -30467,7 +33794,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_schedule_code_upgrade`]."] + #[doc = "Schedule an upgrade as if it was scheduled in the given relay parent block."] pub struct ForceScheduleCodeUpgrade { pub para: force_schedule_code_upgrade::Para, pub new_code: force_schedule_code_upgrade::NewCode, @@ -30494,7 +33821,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_note_new_head`]."] + #[doc = "Note a new block head for para within the context of the current block."] pub struct ForceNoteNewHead { pub para: force_note_new_head::Para, pub new_head: force_note_new_head::NewHead, @@ -30519,7 +33846,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_queue_action`]."] + #[doc = "Put a parachain directly into the next session's action queue."] + #[doc = "We can't queue it any sooner than this without going into the"] + #[doc = "initializer..."] pub struct ForceQueueAction { pub para: force_queue_action::Para, } @@ -30541,7 +33870,20 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::add_trusted_validation_code`]."] + #[doc = "Adds the validation code to the storage."] + #[doc = ""] + #[doc = "The code will not be added if it is already present. Additionally, if PVF pre-checking"] + #[doc = "is running for that code, it will be instantly accepted."] + #[doc = ""] + #[doc = "Otherwise, the code will be added into the storage. Note that the code will be added"] + #[doc = "into storage with reference count 0. This is to account the fact that there are no users"] + #[doc = "for this code yet. The caller will have to make sure that this code eventually gets"] + #[doc = "used by some parachain or removed from the storage to avoid storage leaks. For the"] + #[doc = "latter prefer to use the `poke_unused_validation_code` dispatchable to raw storage"] + #[doc = "manipulation."] + #[doc = ""] + #[doc = "This function is mainly meant to be used for upgrading parachains that do not follow"] + #[doc = "the go-ahead signal while the PVF pre-checking feature is enabled."] pub struct AddTrustedValidationCode { pub validation_code: add_trusted_validation_code::ValidationCode, } @@ -30564,7 +33906,11 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::poke_unused_validation_code`]."] + #[doc = "Remove the validation code from the storage iff the reference count is 0."] + #[doc = ""] + #[doc = "This is better than removing the storage directly, because it will not remove the code"] + #[doc = "that was suddenly got used by some parachain while this dispatchable was pending"] + #[doc = "dispatching."] pub struct PokeUnusedValidationCode { pub validation_code_hash: poke_unused_validation_code::ValidationCodeHash, } @@ -30586,7 +33932,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::include_pvf_check_statement`]."] + #[doc = "Includes a statement for a PVF pre-checking vote. Potentially, finalizes the vote and"] + #[doc = "enacts the results if that was the last vote before achieving the supermajority."] pub struct IncludePvfCheckStatement { pub stmt: include_pvf_check_statement::Stmt, pub signature: include_pvf_check_statement::Signature, @@ -30611,7 +33958,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_set_most_recent_context`]."] + #[doc = "Set the storage for the current parachain head data immediately."] pub struct ForceSetMostRecentContext { pub para: force_set_most_recent_context::Para, pub context: force_set_most_recent_context::Context, @@ -30628,7 +33975,7 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::force_set_current_code`]."] + #[doc = "Set the storage for the parachain validation code immediately."] pub fn force_set_current_code( &self, para: types::force_set_current_code::Para, @@ -30646,7 +33993,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_set_current_head`]."] + #[doc = "Set the storage for the current parachain head data immediately."] pub fn force_set_current_head( &self, para: types::force_set_current_head::Para, @@ -30664,7 +34011,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_schedule_code_upgrade`]."] + #[doc = "Schedule an upgrade as if it was scheduled in the given relay parent block."] pub fn force_schedule_code_upgrade( &self, para: types::force_schedule_code_upgrade::Para, @@ -30687,7 +34034,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_note_new_head`]."] + #[doc = "Note a new block head for para within the context of the current block."] pub fn force_note_new_head( &self, para: types::force_note_new_head::Para, @@ -30704,7 +34051,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_queue_action`]."] + #[doc = "Put a parachain directly into the next session's action queue."] + #[doc = "We can't queue it any sooner than this without going into the"] + #[doc = "initializer..."] pub fn force_queue_action( &self, para: types::force_queue_action::Para, @@ -30721,7 +34070,20 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::add_trusted_validation_code`]."] + #[doc = "Adds the validation code to the storage."] + #[doc = ""] + #[doc = "The code will not be added if it is already present. Additionally, if PVF pre-checking"] + #[doc = "is running for that code, it will be instantly accepted."] + #[doc = ""] + #[doc = "Otherwise, the code will be added into the storage. Note that the code will be added"] + #[doc = "into storage with reference count 0. This is to account the fact that there are no users"] + #[doc = "for this code yet. The caller will have to make sure that this code eventually gets"] + #[doc = "used by some parachain or removed from the storage to avoid storage leaks. For the"] + #[doc = "latter prefer to use the `poke_unused_validation_code` dispatchable to raw storage"] + #[doc = "manipulation."] + #[doc = ""] + #[doc = "This function is mainly meant to be used for upgrading parachains that do not follow"] + #[doc = "the go-ahead signal while the PVF pre-checking feature is enabled."] pub fn add_trusted_validation_code( &self, validation_code: types::add_trusted_validation_code::ValidationCode, @@ -30738,7 +34100,11 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::poke_unused_validation_code`]."] + #[doc = "Remove the validation code from the storage iff the reference count is 0."] + #[doc = ""] + #[doc = "This is better than removing the storage directly, because it will not remove the code"] + #[doc = "that was suddenly got used by some parachain while this dispatchable was pending"] + #[doc = "dispatching."] pub fn poke_unused_validation_code( &self, validation_code_hash: types::poke_unused_validation_code::ValidationCodeHash, @@ -30756,7 +34122,8 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::include_pvf_check_statement`]."] + #[doc = "Includes a statement for a PVF pre-checking vote. Potentially, finalizes the vote and"] + #[doc = "enacts the results if that was the last vote before achieving the supermajority."] pub fn include_pvf_check_statement( &self, stmt: types::include_pvf_check_statement::Stmt, @@ -30774,7 +34141,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_set_most_recent_context`]."] + #[doc = "Set the storage for the current parachain head data immediately."] pub fn force_set_most_recent_context( &self, para: types::force_set_most_recent_context::Para, @@ -31112,7 +34479,7 @@ pub mod api { pub fn pvf_active_vote_map_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::pvf_active_vote_map::PvfActiveVoteMap, (), (), @@ -31121,7 +34488,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "PvfActiveVoteMap", - vec![], + (), [ 72u8, 55u8, 139u8, 104u8, 161u8, 63u8, 114u8, 153u8, 16u8, 221u8, 60u8, 88u8, 52u8, 207u8, 123u8, 193u8, 11u8, 30u8, 19u8, 39u8, 231u8, 39u8, @@ -31137,7 +34504,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::pvf_active_vote_map::PvfActiveVoteMap, ::subxt::storage::address::Yes, (), @@ -31146,9 +34513,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "PvfActiveVoteMap", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 72u8, 55u8, 139u8, 104u8, 161u8, 63u8, 114u8, 153u8, 16u8, 221u8, 60u8, 88u8, 52u8, 207u8, 123u8, 193u8, 11u8, 30u8, 19u8, 39u8, 231u8, 39u8, @@ -31160,7 +34525,7 @@ pub mod api { pub fn pvf_active_vote_list( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::pvf_active_vote_list::PvfActiveVoteList, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -31169,7 +34534,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "PvfActiveVoteList", - vec![], + (), [ 172u8, 215u8, 137u8, 191u8, 52u8, 104u8, 106u8, 118u8, 134u8, 82u8, 137u8, 6u8, 175u8, 158u8, 58u8, 230u8, 231u8, 152u8, 195u8, 17u8, 51u8, @@ -31184,7 +34549,7 @@ pub mod api { pub fn parachains( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::parachains::Parachains, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -31193,7 +34558,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "Parachains", - vec![], + (), [ 242u8, 228u8, 175u8, 107u8, 242u8, 39u8, 52u8, 181u8, 32u8, 171u8, 21u8, 169u8, 204u8, 19u8, 21u8, 217u8, 121u8, 239u8, 218u8, 252u8, @@ -31206,7 +34571,7 @@ pub mod api { pub fn para_lifecycles_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::para_lifecycles::ParaLifecycles, (), (), @@ -31215,7 +34580,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "ParaLifecycles", - vec![], + (), [ 2u8, 203u8, 32u8, 194u8, 76u8, 227u8, 250u8, 9u8, 168u8, 201u8, 171u8, 180u8, 18u8, 169u8, 206u8, 183u8, 48u8, 189u8, 204u8, 192u8, 237u8, @@ -31229,7 +34594,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::para_lifecycles::ParaLifecycles, ::subxt::storage::address::Yes, (), @@ -31238,9 +34603,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "ParaLifecycles", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 2u8, 203u8, 32u8, 194u8, 76u8, 227u8, 250u8, 9u8, 168u8, 201u8, 171u8, 180u8, 18u8, 169u8, 206u8, 183u8, 48u8, 189u8, 204u8, 192u8, 237u8, @@ -31253,7 +34616,7 @@ pub mod api { pub fn heads_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::heads::Heads, (), (), @@ -31262,7 +34625,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "Heads", - vec![], + (), [ 222u8, 116u8, 180u8, 190u8, 172u8, 192u8, 174u8, 132u8, 225u8, 180u8, 119u8, 90u8, 5u8, 39u8, 92u8, 230u8, 116u8, 202u8, 92u8, 99u8, 135u8, @@ -31275,7 +34638,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::heads::Heads, ::subxt::storage::address::Yes, (), @@ -31284,9 +34647,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "Heads", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 222u8, 116u8, 180u8, 190u8, 172u8, 192u8, 174u8, 132u8, 225u8, 180u8, 119u8, 90u8, 5u8, 39u8, 92u8, 230u8, 116u8, 202u8, 92u8, 99u8, 135u8, @@ -31298,7 +34659,7 @@ pub mod api { pub fn most_recent_context_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::most_recent_context::MostRecentContext, (), (), @@ -31307,7 +34668,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "MostRecentContext", - vec![], + (), [ 196u8, 150u8, 125u8, 121u8, 196u8, 182u8, 2u8, 5u8, 244u8, 170u8, 75u8, 57u8, 162u8, 8u8, 104u8, 94u8, 114u8, 32u8, 192u8, 236u8, 120u8, 91u8, @@ -31320,7 +34681,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::most_recent_context::MostRecentContext, ::subxt::storage::address::Yes, (), @@ -31329,9 +34690,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "MostRecentContext", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 196u8, 150u8, 125u8, 121u8, 196u8, 182u8, 2u8, 5u8, 244u8, 170u8, 75u8, 57u8, 162u8, 8u8, 104u8, 94u8, 114u8, 32u8, 192u8, 236u8, 120u8, 91u8, @@ -31345,7 +34704,7 @@ pub mod api { pub fn current_code_hash_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::current_code_hash::CurrentCodeHash, (), (), @@ -31354,7 +34713,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "CurrentCodeHash", - vec![], + (), [ 251u8, 100u8, 30u8, 46u8, 191u8, 60u8, 45u8, 221u8, 218u8, 20u8, 154u8, 233u8, 211u8, 198u8, 151u8, 195u8, 99u8, 210u8, 126u8, 165u8, 240u8, @@ -31370,7 +34729,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::current_code_hash::CurrentCodeHash, ::subxt::storage::address::Yes, (), @@ -31379,9 +34738,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "CurrentCodeHash", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 251u8, 100u8, 30u8, 46u8, 191u8, 60u8, 45u8, 221u8, 218u8, 20u8, 154u8, 233u8, 211u8, 198u8, 151u8, 195u8, 99u8, 210u8, 126u8, 165u8, 240u8, @@ -31397,7 +34754,7 @@ pub mod api { pub fn past_code_hash_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::past_code_hash::PastCodeHash, (), (), @@ -31406,7 +34763,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "PastCodeHash", - vec![], + (), [ 73u8, 209u8, 188u8, 36u8, 127u8, 42u8, 171u8, 136u8, 29u8, 126u8, 220u8, 209u8, 230u8, 22u8, 12u8, 63u8, 8u8, 102u8, 45u8, 158u8, 178u8, @@ -31422,7 +34779,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::past_code_hash::PastCodeHash, (), (), @@ -31431,9 +34788,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "PastCodeHash", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 73u8, 209u8, 188u8, 36u8, 127u8, 42u8, 171u8, 136u8, 29u8, 126u8, 220u8, 209u8, 230u8, 22u8, 12u8, 63u8, 8u8, 102u8, 45u8, 158u8, 178u8, @@ -31450,7 +34805,10 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey, + ::subxt::storage::address::StaticStorageKey, + ), types::past_code_hash::PastCodeHash, ::subxt::storage::address::Yes, (), @@ -31459,10 +34817,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "PastCodeHash", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 73u8, 209u8, 188u8, 36u8, 127u8, 42u8, 171u8, 136u8, 29u8, 126u8, 220u8, 209u8, 230u8, 22u8, 12u8, 63u8, 8u8, 102u8, 45u8, 158u8, 178u8, @@ -31476,7 +34834,7 @@ pub mod api { pub fn past_code_meta_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::past_code_meta::PastCodeMeta, (), ::subxt::storage::address::Yes, @@ -31485,7 +34843,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "PastCodeMeta", - vec![], + (), [ 233u8, 47u8, 137u8, 174u8, 98u8, 64u8, 11u8, 75u8, 93u8, 222u8, 78u8, 58u8, 66u8, 245u8, 151u8, 39u8, 144u8, 36u8, 84u8, 176u8, 239u8, 183u8, @@ -31500,7 +34858,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::past_code_meta::PastCodeMeta, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -31509,9 +34867,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "PastCodeMeta", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 233u8, 47u8, 137u8, 174u8, 98u8, 64u8, 11u8, 75u8, 93u8, 222u8, 78u8, 58u8, 66u8, 245u8, 151u8, 39u8, 144u8, 36u8, 84u8, 176u8, 239u8, 183u8, @@ -31528,7 +34884,7 @@ pub mod api { pub fn past_code_pruning( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::past_code_pruning::PastCodePruning, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -31537,7 +34893,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "PastCodePruning", - vec![], + (), [ 67u8, 190u8, 51u8, 133u8, 173u8, 24u8, 151u8, 111u8, 108u8, 152u8, 106u8, 18u8, 29u8, 80u8, 104u8, 120u8, 91u8, 138u8, 209u8, 49u8, 255u8, @@ -31551,7 +34907,7 @@ pub mod api { pub fn future_code_upgrades_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::future_code_upgrades::FutureCodeUpgrades, (), (), @@ -31560,7 +34916,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "FutureCodeUpgrades", - vec![], + (), [ 163u8, 168u8, 23u8, 138u8, 198u8, 70u8, 135u8, 221u8, 167u8, 187u8, 15u8, 144u8, 228u8, 8u8, 138u8, 125u8, 101u8, 154u8, 11u8, 74u8, 173u8, @@ -31575,7 +34931,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::future_code_upgrades::Param0, + >, types::future_code_upgrades::FutureCodeUpgrades, ::subxt::storage::address::Yes, (), @@ -31584,9 +34942,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "FutureCodeUpgrades", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 163u8, 168u8, 23u8, 138u8, 198u8, 70u8, 135u8, 221u8, 167u8, 187u8, 15u8, 144u8, 228u8, 8u8, 138u8, 125u8, 101u8, 154u8, 11u8, 74u8, 173u8, @@ -31600,7 +34956,7 @@ pub mod api { pub fn future_code_hash_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::future_code_hash::FutureCodeHash, (), (), @@ -31609,7 +34965,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "FutureCodeHash", - vec![], + (), [ 62u8, 238u8, 183u8, 12u8, 197u8, 119u8, 163u8, 239u8, 192u8, 228u8, 110u8, 58u8, 128u8, 223u8, 32u8, 137u8, 109u8, 127u8, 41u8, 83u8, 91u8, @@ -31624,7 +34980,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::future_code_hash::FutureCodeHash, ::subxt::storage::address::Yes, (), @@ -31633,9 +34989,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "FutureCodeHash", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 62u8, 238u8, 183u8, 12u8, 197u8, 119u8, 163u8, 239u8, 192u8, 228u8, 110u8, 58u8, 128u8, 223u8, 32u8, 137u8, 109u8, 127u8, 41u8, 83u8, 91u8, @@ -31656,7 +35010,7 @@ pub mod api { pub fn upgrade_go_ahead_signal_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::upgrade_go_ahead_signal::UpgradeGoAheadSignal, (), (), @@ -31665,7 +35019,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "UpgradeGoAheadSignal", - vec![], + (), [ 41u8, 80u8, 120u8, 6u8, 98u8, 85u8, 36u8, 37u8, 170u8, 189u8, 56u8, 127u8, 155u8, 180u8, 112u8, 195u8, 135u8, 214u8, 235u8, 87u8, 197u8, @@ -31688,7 +35042,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::upgrade_go_ahead_signal::Param0, + >, types::upgrade_go_ahead_signal::UpgradeGoAheadSignal, ::subxt::storage::address::Yes, (), @@ -31697,9 +35053,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "UpgradeGoAheadSignal", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 41u8, 80u8, 120u8, 6u8, 98u8, 85u8, 36u8, 37u8, 170u8, 189u8, 56u8, 127u8, 155u8, 180u8, 112u8, 195u8, 135u8, 214u8, 235u8, 87u8, 197u8, @@ -31720,7 +35074,7 @@ pub mod api { pub fn upgrade_restriction_signal_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::upgrade_restriction_signal::UpgradeRestrictionSignal, (), (), @@ -31729,7 +35083,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "UpgradeRestrictionSignal", - vec![], + (), [ 158u8, 105u8, 62u8, 252u8, 149u8, 145u8, 34u8, 92u8, 119u8, 204u8, 46u8, 96u8, 117u8, 183u8, 134u8, 20u8, 172u8, 243u8, 145u8, 113u8, @@ -31751,7 +35105,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::upgrade_restriction_signal::Param0, + >, types::upgrade_restriction_signal::UpgradeRestrictionSignal, ::subxt::storage::address::Yes, (), @@ -31760,9 +35116,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "UpgradeRestrictionSignal", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 158u8, 105u8, 62u8, 252u8, 149u8, 145u8, 34u8, 92u8, 119u8, 204u8, 46u8, 96u8, 117u8, 183u8, 134u8, 20u8, 172u8, 243u8, 145u8, 113u8, @@ -31777,7 +35131,7 @@ pub mod api { pub fn upgrade_cooldowns( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::upgrade_cooldowns::UpgradeCooldowns, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -31786,7 +35140,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "UpgradeCooldowns", - vec![], + (), [ 180u8, 197u8, 115u8, 209u8, 126u8, 120u8, 133u8, 54u8, 232u8, 192u8, 47u8, 17u8, 21u8, 8u8, 231u8, 67u8, 1u8, 89u8, 127u8, 38u8, 179u8, @@ -31802,7 +35156,7 @@ pub mod api { pub fn upcoming_upgrades( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::upcoming_upgrades::UpcomingUpgrades, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -31811,7 +35165,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "UpcomingUpgrades", - vec![], + (), [ 38u8, 195u8, 15u8, 56u8, 225u8, 199u8, 105u8, 84u8, 128u8, 51u8, 44u8, 248u8, 237u8, 32u8, 36u8, 72u8, 77u8, 137u8, 124u8, 88u8, 242u8, 185u8, @@ -31823,7 +35177,7 @@ pub mod api { pub fn actions_queue_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::actions_queue::ActionsQueue, (), ::subxt::storage::address::Yes, @@ -31832,7 +35186,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "ActionsQueue", - vec![], + (), [ 13u8, 25u8, 129u8, 203u8, 95u8, 206u8, 254u8, 240u8, 170u8, 209u8, 55u8, 117u8, 70u8, 220u8, 139u8, 102u8, 9u8, 229u8, 139u8, 120u8, 67u8, @@ -31845,7 +35199,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::actions_queue::ActionsQueue, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -31854,9 +35208,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "ActionsQueue", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 13u8, 25u8, 129u8, 203u8, 95u8, 206u8, 254u8, 240u8, 170u8, 209u8, 55u8, 117u8, 70u8, 220u8, 139u8, 102u8, 9u8, 229u8, 139u8, 120u8, 67u8, @@ -31871,7 +35223,7 @@ pub mod api { pub fn upcoming_paras_genesis_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::upcoming_paras_genesis::UpcomingParasGenesis, (), (), @@ -31880,7 +35232,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "UpcomingParasGenesis", - vec![], + (), [ 215u8, 121u8, 106u8, 13u8, 102u8, 47u8, 129u8, 221u8, 153u8, 91u8, 23u8, 94u8, 11u8, 39u8, 19u8, 180u8, 136u8, 136u8, 254u8, 152u8, 250u8, @@ -31897,7 +35249,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::upcoming_paras_genesis::Param0, + >, types::upcoming_paras_genesis::UpcomingParasGenesis, ::subxt::storage::address::Yes, (), @@ -31906,9 +35260,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "UpcomingParasGenesis", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 215u8, 121u8, 106u8, 13u8, 102u8, 47u8, 129u8, 221u8, 153u8, 91u8, 23u8, 94u8, 11u8, 39u8, 19u8, 180u8, 136u8, 136u8, 254u8, 152u8, 250u8, @@ -31921,7 +35273,7 @@ pub mod api { pub fn code_by_hash_refs_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::code_by_hash_refs::CodeByHashRefs, (), ::subxt::storage::address::Yes, @@ -31930,7 +35282,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "CodeByHashRefs", - vec![], + (), [ 47u8, 50u8, 103u8, 161u8, 130u8, 252u8, 157u8, 35u8, 174u8, 37u8, 102u8, 60u8, 195u8, 30u8, 164u8, 203u8, 67u8, 129u8, 107u8, 181u8, @@ -31944,7 +35296,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::code_by_hash_refs::CodeByHashRefs, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -31953,9 +35305,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "CodeByHashRefs", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 47u8, 50u8, 103u8, 161u8, 130u8, 252u8, 157u8, 35u8, 174u8, 37u8, 102u8, 60u8, 195u8, 30u8, 164u8, 203u8, 67u8, 129u8, 107u8, 181u8, @@ -31971,7 +35321,7 @@ pub mod api { pub fn code_by_hash_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::code_by_hash::CodeByHash, (), (), @@ -31980,7 +35330,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "CodeByHash", - vec![], + (), [ 155u8, 102u8, 73u8, 180u8, 127u8, 211u8, 181u8, 44u8, 56u8, 235u8, 49u8, 4u8, 25u8, 213u8, 116u8, 200u8, 232u8, 203u8, 190u8, 90u8, 93u8, @@ -31996,7 +35346,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::code_by_hash::CodeByHash, ::subxt::storage::address::Yes, (), @@ -32005,9 +35355,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Paras", "CodeByHash", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 155u8, 102u8, 73u8, 180u8, 127u8, 211u8, 181u8, 44u8, 56u8, 235u8, 49u8, 4u8, 25u8, 213u8, 116u8, 200u8, 232u8, 203u8, 190u8, 90u8, 93u8, @@ -32059,7 +35407,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_approve`]."] + #[doc = "Issue a signal to the consensus engine to forcibly act as though all parachain"] + #[doc = "blocks in all relay chain blocks up to and including the given number in the current"] + #[doc = "chain are valid and should be finalized."] pub struct ForceApprove { pub up_to: force_approve::UpTo, } @@ -32074,7 +35424,9 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::force_approve`]."] + #[doc = "Issue a signal to the consensus engine to forcibly act as though all parachain"] + #[doc = "blocks in all relay chain blocks up to and including the given number in the current"] + #[doc = "chain are valid and should be finalized."] pub fn force_approve( &self, up_to: types::force_approve::UpTo, @@ -32119,7 +35471,7 @@ pub mod api { pub fn has_initialized( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::has_initialized::HasInitialized, ::subxt::storage::address::Yes, (), @@ -32128,7 +35480,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Initializer", "HasInitialized", - vec![], + (), [ 156u8, 208u8, 212u8, 86u8, 105u8, 148u8, 252u8, 11u8, 140u8, 67u8, 231u8, 86u8, 1u8, 147u8, 178u8, 79u8, 27u8, 249u8, 137u8, 103u8, 178u8, @@ -32146,7 +35498,7 @@ pub mod api { pub fn buffered_session_changes( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::buffered_session_changes::BufferedSessionChanges, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -32155,7 +35507,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Initializer", "BufferedSessionChanges", - vec![], + (), [ 99u8, 153u8, 100u8, 11u8, 28u8, 62u8, 163u8, 239u8, 177u8, 55u8, 151u8, 242u8, 227u8, 59u8, 176u8, 10u8, 227u8, 51u8, 252u8, 191u8, 233u8, @@ -32200,7 +35552,7 @@ pub mod api { pub fn downward_message_queues_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::downward_message_queues::DownwardMessageQueues, (), ::subxt::storage::address::Yes, @@ -32209,7 +35561,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Dmp", "DownwardMessageQueues", - vec![], + (), [ 38u8, 183u8, 133u8, 200u8, 199u8, 135u8, 68u8, 232u8, 189u8, 168u8, 3u8, 219u8, 201u8, 180u8, 156u8, 79u8, 134u8, 164u8, 94u8, 114u8, @@ -32223,7 +35575,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::downward_message_queues::Param0, + >, types::downward_message_queues::DownwardMessageQueues, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -32232,9 +35586,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Dmp", "DownwardMessageQueues", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 38u8, 183u8, 133u8, 200u8, 199u8, 135u8, 68u8, 232u8, 189u8, 168u8, 3u8, 219u8, 201u8, 180u8, 156u8, 79u8, 134u8, 164u8, 94u8, 114u8, @@ -32253,7 +35605,7 @@ pub mod api { pub fn downward_message_queue_heads_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::downward_message_queue_heads::DownwardMessageQueueHeads, (), ::subxt::storage::address::Yes, @@ -32262,7 +35614,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Dmp", "DownwardMessageQueueHeads", - vec![], + (), [ 135u8, 165u8, 240u8, 0u8, 25u8, 110u8, 9u8, 108u8, 251u8, 225u8, 109u8, 184u8, 90u8, 132u8, 9u8, 151u8, 12u8, 118u8, 153u8, 212u8, 140u8, @@ -32281,7 +35633,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::downward_message_queue_heads::Param0, + >, types::downward_message_queue_heads::DownwardMessageQueueHeads, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -32290,9 +35644,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Dmp", "DownwardMessageQueueHeads", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 135u8, 165u8, 240u8, 0u8, 25u8, 110u8, 9u8, 108u8, 251u8, 225u8, 109u8, 184u8, 90u8, 132u8, 9u8, 151u8, 12u8, 118u8, 153u8, 212u8, 140u8, @@ -32304,7 +35656,7 @@ pub mod api { pub fn delivery_fee_factor_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::delivery_fee_factor::DeliveryFeeFactor, (), ::subxt::storage::address::Yes, @@ -32313,7 +35665,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Dmp", "DeliveryFeeFactor", - vec![], + (), [ 43u8, 5u8, 63u8, 235u8, 115u8, 155u8, 130u8, 27u8, 75u8, 216u8, 177u8, 135u8, 203u8, 147u8, 167u8, 95u8, 208u8, 188u8, 25u8, 14u8, 84u8, 63u8, @@ -32326,7 +35678,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::delivery_fee_factor::DeliveryFeeFactor, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -32335,9 +35687,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Dmp", "DeliveryFeeFactor", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 43u8, 5u8, 63u8, 235u8, 115u8, 155u8, 130u8, 27u8, 75u8, 216u8, 177u8, 135u8, 203u8, 147u8, 167u8, 95u8, 208u8, 188u8, 25u8, 14u8, 84u8, 63u8, @@ -32371,7 +35721,16 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::hrmp_init_open_channel`]."] + #[doc = "Initiate opening a channel from a parachain to a given recipient with given channel"] + #[doc = "parameters."] + #[doc = ""] + #[doc = "- `proposed_max_capacity` - specifies how many messages can be in the channel at once."] + #[doc = "- `proposed_max_message_size` - specifies the maximum size of the messages."] + #[doc = ""] + #[doc = "These numbers are a subject to the relay-chain configuration limits."] + #[doc = ""] + #[doc = "The channel can be opened only after the recipient confirms it and only on a session"] + #[doc = "change."] pub struct HrmpInitOpenChannel { pub recipient: hrmp_init_open_channel::Recipient, pub proposed_max_capacity: hrmp_init_open_channel::ProposedMaxCapacity, @@ -32398,7 +35757,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::hrmp_accept_open_channel`]."] + #[doc = "Accept a pending open channel request from the given sender."] + #[doc = ""] + #[doc = "The channel will be opened only on the next session boundary."] pub struct HrmpAcceptOpenChannel { pub sender: hrmp_accept_open_channel::Sender, } @@ -32420,7 +35781,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::hrmp_close_channel`]."] + #[doc = "Initiate unilateral closing of a channel. The origin must be either the sender or the"] + #[doc = "recipient in the channel being closed."] + #[doc = ""] + #[doc = "The closure can only happen on a session change."] pub struct HrmpCloseChannel { pub channel_id: hrmp_close_channel::ChannelId, } @@ -32443,7 +35807,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_clean_hrmp`]."] + #[doc = "This extrinsic triggers the cleanup of all the HRMP storage items that a para may have."] + #[doc = "Normally this happens once per session, but this allows you to trigger the cleanup"] + #[doc = "immediately for a specific parachain."] + #[doc = ""] + #[doc = "Number of inbound and outbound channels for `para` must be provided as witness data."] + #[doc = ""] + #[doc = "Origin must be the `ChannelManager`."] pub struct ForceCleanHrmp { pub para: force_clean_hrmp::Para, pub num_inbound: force_clean_hrmp::NumInbound, @@ -32469,7 +35839,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_process_hrmp_open`]."] + #[doc = "Force process HRMP open channel requests."] + #[doc = ""] + #[doc = "If there are pending HRMP open channel requests, you can use this function to process"] + #[doc = "all of those requests immediately."] + #[doc = ""] + #[doc = "Total number of opening channels must be provided as witness data."] + #[doc = ""] + #[doc = "Origin must be the `ChannelManager`."] pub struct ForceProcessHrmpOpen { pub channels: force_process_hrmp_open::Channels, } @@ -32491,7 +35868,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_process_hrmp_close`]."] + #[doc = "Force process HRMP close channel requests."] + #[doc = ""] + #[doc = "If there are pending HRMP close channel requests, you can use this function to process"] + #[doc = "all of those requests immediately."] + #[doc = ""] + #[doc = "Total number of closing channels must be provided as witness data."] + #[doc = ""] + #[doc = "Origin must be the `ChannelManager`."] pub struct ForceProcessHrmpClose { pub channels: force_process_hrmp_close::Channels, } @@ -32513,7 +35897,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::hrmp_cancel_open_request`]."] + #[doc = "This cancels a pending open channel request. It can be canceled by either of the sender"] + #[doc = "or the recipient for that request. The origin must be either of those."] + #[doc = ""] + #[doc = "The cancellation happens immediately. It is not possible to cancel the request if it is"] + #[doc = "already accepted."] + #[doc = ""] + #[doc = "Total number of open requests (i.e. `HrmpOpenChannelRequestsList`) must be provided as"] + #[doc = "witness data."] pub struct HrmpCancelOpenRequest { pub channel_id: hrmp_cancel_open_request::ChannelId, pub open_requests: hrmp_cancel_open_request::OpenRequests, @@ -32538,7 +35929,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_open_hrmp_channel`]."] + #[doc = "Open a channel from a `sender` to a `recipient` `ParaId`. Although opened by governance,"] + #[doc = "the `max_capacity` and `max_message_size` are still subject to the Relay Chain's"] + #[doc = "configured limits."] + #[doc = ""] + #[doc = "Expected use is when one (and only one) of the `ParaId`s involved in the channel is"] + #[doc = "governed by the system, e.g. a system parachain."] + #[doc = ""] + #[doc = "Origin must be the `ChannelManager`."] pub struct ForceOpenHrmpChannel { pub sender: force_open_hrmp_channel::Sender, pub recipient: force_open_hrmp_channel::Recipient, @@ -32567,7 +35965,18 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::establish_system_channel`]."] + #[doc = "Establish an HRMP channel between two system chains. If the channel does not already"] + #[doc = "exist, the transaction fees will be refunded to the caller. The system does not take"] + #[doc = "deposits for channels between system chains, and automatically sets the message number"] + #[doc = "and size limits to the maximum allowed by the network's configuration."] + #[doc = ""] + #[doc = "Arguments:"] + #[doc = ""] + #[doc = "- `sender`: A system chain, `ParaId`."] + #[doc = "- `recipient`: A system chain, `ParaId`."] + #[doc = ""] + #[doc = "Any signed origin can call this function, but _both_ inputs MUST be system chains. If"] + #[doc = "the channel does not exist yet, there is no fee."] pub struct EstablishSystemChannel { pub sender: establish_system_channel::Sender, pub recipient: establish_system_channel::Recipient, @@ -32592,7 +36001,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::poke_channel_deposits`]."] + #[doc = "Update the deposits held for an HRMP channel to the latest `Configuration`. Channels"] + #[doc = "with system chains do not require a deposit."] + #[doc = ""] + #[doc = "Arguments:"] + #[doc = ""] + #[doc = "- `sender`: A chain, `ParaId`."] + #[doc = "- `recipient`: A chain, `ParaId`."] + #[doc = ""] + #[doc = "Any signed origin can call this function."] pub struct PokeChannelDeposits { pub sender: poke_channel_deposits::Sender, pub recipient: poke_channel_deposits::Recipient, @@ -32610,7 +36027,16 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::hrmp_init_open_channel`]."] + #[doc = "Initiate opening a channel from a parachain to a given recipient with given channel"] + #[doc = "parameters."] + #[doc = ""] + #[doc = "- `proposed_max_capacity` - specifies how many messages can be in the channel at once."] + #[doc = "- `proposed_max_message_size` - specifies the maximum size of the messages."] + #[doc = ""] + #[doc = "These numbers are a subject to the relay-chain configuration limits."] + #[doc = ""] + #[doc = "The channel can be opened only after the recipient confirms it and only on a session"] + #[doc = "change."] pub fn hrmp_init_open_channel( &self, recipient: types::hrmp_init_open_channel::Recipient, @@ -32633,7 +36059,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::hrmp_accept_open_channel`]."] + #[doc = "Accept a pending open channel request from the given sender."] + #[doc = ""] + #[doc = "The channel will be opened only on the next session boundary."] pub fn hrmp_accept_open_channel( &self, sender: types::hrmp_accept_open_channel::Sender, @@ -32649,7 +36077,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::hrmp_close_channel`]."] + #[doc = "Initiate unilateral closing of a channel. The origin must be either the sender or the"] + #[doc = "recipient in the channel being closed."] + #[doc = ""] + #[doc = "The closure can only happen on a session change."] pub fn hrmp_close_channel( &self, channel_id: types::hrmp_close_channel::ChannelId, @@ -32666,7 +36097,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_clean_hrmp`]."] + #[doc = "This extrinsic triggers the cleanup of all the HRMP storage items that a para may have."] + #[doc = "Normally this happens once per session, but this allows you to trigger the cleanup"] + #[doc = "immediately for a specific parachain."] + #[doc = ""] + #[doc = "Number of inbound and outbound channels for `para` must be provided as witness data."] + #[doc = ""] + #[doc = "Origin must be the `ChannelManager`."] pub fn force_clean_hrmp( &self, para: types::force_clean_hrmp::Para, @@ -32688,7 +36125,14 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_process_hrmp_open`]."] + #[doc = "Force process HRMP open channel requests."] + #[doc = ""] + #[doc = "If there are pending HRMP open channel requests, you can use this function to process"] + #[doc = "all of those requests immediately."] + #[doc = ""] + #[doc = "Total number of opening channels must be provided as witness data."] + #[doc = ""] + #[doc = "Origin must be the `ChannelManager`."] pub fn force_process_hrmp_open( &self, channels: types::force_process_hrmp_open::Channels, @@ -32705,7 +36149,14 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_process_hrmp_close`]."] + #[doc = "Force process HRMP close channel requests."] + #[doc = ""] + #[doc = "If there are pending HRMP close channel requests, you can use this function to process"] + #[doc = "all of those requests immediately."] + #[doc = ""] + #[doc = "Total number of closing channels must be provided as witness data."] + #[doc = ""] + #[doc = "Origin must be the `ChannelManager`."] pub fn force_process_hrmp_close( &self, channels: types::force_process_hrmp_close::Channels, @@ -32722,7 +36173,14 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::hrmp_cancel_open_request`]."] + #[doc = "This cancels a pending open channel request. It can be canceled by either of the sender"] + #[doc = "or the recipient for that request. The origin must be either of those."] + #[doc = ""] + #[doc = "The cancellation happens immediately. It is not possible to cancel the request if it is"] + #[doc = "already accepted."] + #[doc = ""] + #[doc = "Total number of open requests (i.e. `HrmpOpenChannelRequestsList`) must be provided as"] + #[doc = "witness data."] pub fn hrmp_cancel_open_request( &self, channel_id: types::hrmp_cancel_open_request::ChannelId, @@ -32742,7 +36200,14 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_open_hrmp_channel`]."] + #[doc = "Open a channel from a `sender` to a `recipient` `ParaId`. Although opened by governance,"] + #[doc = "the `max_capacity` and `max_message_size` are still subject to the Relay Chain's"] + #[doc = "configured limits."] + #[doc = ""] + #[doc = "Expected use is when one (and only one) of the `ParaId`s involved in the channel is"] + #[doc = "governed by the system, e.g. a system parachain."] + #[doc = ""] + #[doc = "Origin must be the `ChannelManager`."] pub fn force_open_hrmp_channel( &self, sender: types::force_open_hrmp_channel::Sender, @@ -32766,7 +36231,18 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::establish_system_channel`]."] + #[doc = "Establish an HRMP channel between two system chains. If the channel does not already"] + #[doc = "exist, the transaction fees will be refunded to the caller. The system does not take"] + #[doc = "deposits for channels between system chains, and automatically sets the message number"] + #[doc = "and size limits to the maximum allowed by the network's configuration."] + #[doc = ""] + #[doc = "Arguments:"] + #[doc = ""] + #[doc = "- `sender`: A system chain, `ParaId`."] + #[doc = "- `recipient`: A system chain, `ParaId`."] + #[doc = ""] + #[doc = "Any signed origin can call this function, but _both_ inputs MUST be system chains. If"] + #[doc = "the channel does not exist yet, there is no fee."] pub fn establish_system_channel( &self, sender: types::establish_system_channel::Sender, @@ -32783,7 +36259,15 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::poke_channel_deposits`]."] + #[doc = "Update the deposits held for an HRMP channel to the latest `Configuration`. Channels"] + #[doc = "with system chains do not require a deposit."] + #[doc = ""] + #[doc = "Arguments:"] + #[doc = ""] + #[doc = "- `sender`: A chain, `ParaId`."] + #[doc = "- `recipient`: A chain, `ParaId`."] + #[doc = ""] + #[doc = "Any signed origin can call this function."] pub fn poke_channel_deposits( &self, sender: types::poke_channel_deposits::Sender, @@ -33086,7 +36570,7 @@ pub mod api { pub fn hrmp_open_channel_requests_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::hrmp_open_channel_requests::HrmpOpenChannelRequests, (), (), @@ -33095,7 +36579,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpOpenChannelRequests", - vec![], + (), [ 164u8, 97u8, 52u8, 242u8, 255u8, 67u8, 248u8, 170u8, 204u8, 92u8, 81u8, 144u8, 11u8, 63u8, 145u8, 167u8, 8u8, 174u8, 221u8, 147u8, 125u8, @@ -33114,7 +36598,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::hrmp_open_channel_requests::Param0, + >, types::hrmp_open_channel_requests::HrmpOpenChannelRequests, ::subxt::storage::address::Yes, (), @@ -33123,9 +36609,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpOpenChannelRequests", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 164u8, 97u8, 52u8, 242u8, 255u8, 67u8, 248u8, 170u8, 204u8, 92u8, 81u8, 144u8, 11u8, 63u8, 145u8, 167u8, 8u8, 174u8, 221u8, 147u8, 125u8, @@ -33137,7 +36621,7 @@ pub mod api { pub fn hrmp_open_channel_requests_list( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::hrmp_open_channel_requests_list::HrmpOpenChannelRequestsList, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -33146,7 +36630,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpOpenChannelRequestsList", - vec![], + (), [ 45u8, 190u8, 124u8, 26u8, 37u8, 249u8, 140u8, 254u8, 101u8, 249u8, 27u8, 117u8, 218u8, 3u8, 126u8, 114u8, 143u8, 65u8, 122u8, 246u8, @@ -33161,7 +36645,7 @@ pub mod api { pub fn hrmp_open_channel_request_count_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::hrmp_open_channel_request_count::HrmpOpenChannelRequestCount, (), ::subxt::storage::address::Yes, @@ -33170,7 +36654,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpOpenChannelRequestCount", - vec![], + (), [ 136u8, 72u8, 56u8, 31u8, 229u8, 99u8, 241u8, 14u8, 159u8, 243u8, 179u8, 222u8, 252u8, 56u8, 63u8, 24u8, 204u8, 130u8, 47u8, 161u8, 133u8, @@ -33186,7 +36670,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::hrmp_open_channel_request_count::Param0, + >, types::hrmp_open_channel_request_count::HrmpOpenChannelRequestCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -33195,9 +36681,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpOpenChannelRequestCount", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 136u8, 72u8, 56u8, 31u8, 229u8, 99u8, 241u8, 14u8, 159u8, 243u8, 179u8, 222u8, 252u8, 56u8, 63u8, 24u8, 204u8, 130u8, 47u8, 161u8, 133u8, @@ -33212,7 +36696,7 @@ pub mod api { pub fn hrmp_accepted_channel_request_count_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::hrmp_accepted_channel_request_count::HrmpAcceptedChannelRequestCount, (), ::subxt::storage::address::Yes, @@ -33221,7 +36705,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpAcceptedChannelRequestCount", - vec![], + (), [ 29u8, 100u8, 52u8, 28u8, 180u8, 84u8, 132u8, 120u8, 117u8, 172u8, 169u8, 40u8, 237u8, 92u8, 89u8, 87u8, 230u8, 148u8, 140u8, 226u8, 60u8, @@ -33237,7 +36721,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::hrmp_accepted_channel_request_count::Param0, + >, types::hrmp_accepted_channel_request_count::HrmpAcceptedChannelRequestCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -33246,9 +36732,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpAcceptedChannelRequestCount", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 29u8, 100u8, 52u8, 28u8, 180u8, 84u8, 132u8, 120u8, 117u8, 172u8, 169u8, 40u8, 237u8, 92u8, 89u8, 87u8, 230u8, 148u8, 140u8, 226u8, 60u8, @@ -33267,7 +36751,7 @@ pub mod api { pub fn hrmp_close_channel_requests_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::hrmp_close_channel_requests::HrmpCloseChannelRequests, (), (), @@ -33276,7 +36760,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpCloseChannelRequests", - vec![], + (), [ 155u8, 13u8, 73u8, 166u8, 58u8, 67u8, 138u8, 58u8, 215u8, 172u8, 241u8, 168u8, 57u8, 4u8, 230u8, 248u8, 31u8, 183u8, 227u8, 224u8, 139u8, @@ -33296,7 +36780,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::hrmp_close_channel_requests::Param0, + >, types::hrmp_close_channel_requests::HrmpCloseChannelRequests, ::subxt::storage::address::Yes, (), @@ -33305,9 +36791,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpCloseChannelRequests", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 155u8, 13u8, 73u8, 166u8, 58u8, 67u8, 138u8, 58u8, 215u8, 172u8, 241u8, 168u8, 57u8, 4u8, 230u8, 248u8, 31u8, 183u8, 227u8, 224u8, 139u8, @@ -33319,7 +36803,7 @@ pub mod api { pub fn hrmp_close_channel_requests_list( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::hrmp_close_channel_requests_list::HrmpCloseChannelRequestsList, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -33328,7 +36812,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpCloseChannelRequestsList", - vec![], + (), [ 78u8, 194u8, 214u8, 232u8, 91u8, 72u8, 109u8, 113u8, 88u8, 86u8, 136u8, 26u8, 226u8, 30u8, 11u8, 188u8, 57u8, 77u8, 169u8, 64u8, 14u8, 187u8, @@ -33343,7 +36827,7 @@ pub mod api { pub fn hrmp_watermarks_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::hrmp_watermarks::HrmpWatermarks, (), (), @@ -33352,7 +36836,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpWatermarks", - vec![], + (), [ 245u8, 104u8, 137u8, 120u8, 131u8, 7u8, 178u8, 85u8, 96u8, 124u8, 241u8, 2u8, 86u8, 63u8, 116u8, 77u8, 217u8, 235u8, 162u8, 38u8, 104u8, @@ -33368,7 +36852,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::hrmp_watermarks::HrmpWatermarks, ::subxt::storage::address::Yes, (), @@ -33377,9 +36861,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpWatermarks", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 245u8, 104u8, 137u8, 120u8, 131u8, 7u8, 178u8, 85u8, 96u8, 124u8, 241u8, 2u8, 86u8, 63u8, 116u8, 77u8, 217u8, 235u8, 162u8, 38u8, 104u8, @@ -33393,7 +36875,7 @@ pub mod api { pub fn hrmp_channels_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::hrmp_channels::HrmpChannels, (), (), @@ -33402,7 +36884,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpChannels", - vec![], + (), [ 174u8, 90u8, 72u8, 93u8, 43u8, 140u8, 181u8, 170u8, 138u8, 171u8, 179u8, 156u8, 33u8, 87u8, 63u8, 1u8, 131u8, 59u8, 230u8, 14u8, 40u8, @@ -33418,7 +36900,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::hrmp_channels::HrmpChannels, ::subxt::storage::address::Yes, (), @@ -33427,9 +36909,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpChannels", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 174u8, 90u8, 72u8, 93u8, 43u8, 140u8, 181u8, 170u8, 138u8, 171u8, 179u8, 156u8, 33u8, 87u8, 63u8, 1u8, 131u8, 59u8, 230u8, 14u8, 40u8, @@ -33454,7 +36934,7 @@ pub mod api { pub fn hrmp_ingress_channels_index_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::hrmp_ingress_channels_index::HrmpIngressChannelsIndex, (), ::subxt::storage::address::Yes, @@ -33463,7 +36943,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpIngressChannelsIndex", - vec![], + (), [ 125u8, 229u8, 102u8, 230u8, 74u8, 109u8, 173u8, 67u8, 176u8, 169u8, 57u8, 24u8, 75u8, 129u8, 246u8, 198u8, 63u8, 49u8, 56u8, 102u8, 149u8, @@ -33489,7 +36969,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::hrmp_ingress_channels_index::Param0, + >, types::hrmp_ingress_channels_index::HrmpIngressChannelsIndex, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -33498,9 +36980,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpIngressChannelsIndex", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 125u8, 229u8, 102u8, 230u8, 74u8, 109u8, 173u8, 67u8, 176u8, 169u8, 57u8, 24u8, 75u8, 129u8, 246u8, 198u8, 63u8, 49u8, 56u8, 102u8, 149u8, @@ -33512,7 +36992,7 @@ pub mod api { pub fn hrmp_egress_channels_index_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::hrmp_egress_channels_index::HrmpEgressChannelsIndex, (), ::subxt::storage::address::Yes, @@ -33521,7 +37001,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpEgressChannelsIndex", - vec![], + (), [ 237u8, 183u8, 188u8, 57u8, 20u8, 238u8, 166u8, 7u8, 94u8, 155u8, 22u8, 9u8, 173u8, 209u8, 210u8, 17u8, 160u8, 79u8, 243u8, 4u8, 245u8, 240u8, @@ -33533,7 +37013,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::hrmp_egress_channels_index::Param0, + >, types::hrmp_egress_channels_index::HrmpEgressChannelsIndex, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -33542,9 +37024,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpEgressChannelsIndex", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 237u8, 183u8, 188u8, 57u8, 20u8, 238u8, 166u8, 7u8, 94u8, 155u8, 22u8, 9u8, 173u8, 209u8, 210u8, 17u8, 160u8, 79u8, 243u8, 4u8, 245u8, 240u8, @@ -33557,7 +37037,7 @@ pub mod api { pub fn hrmp_channel_contents_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::hrmp_channel_contents::HrmpChannelContents, (), ::subxt::storage::address::Yes, @@ -33566,7 +37046,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpChannelContents", - vec![], + (), [ 55u8, 16u8, 135u8, 69u8, 54u8, 180u8, 246u8, 124u8, 104u8, 92u8, 45u8, 18u8, 223u8, 145u8, 43u8, 190u8, 121u8, 59u8, 35u8, 195u8, 234u8, @@ -33581,7 +37061,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::hrmp_channel_contents::Param0, + >, types::hrmp_channel_contents::HrmpChannelContents, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -33590,9 +37072,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpChannelContents", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 55u8, 16u8, 135u8, 69u8, 54u8, 180u8, 246u8, 124u8, 104u8, 92u8, 45u8, 18u8, 223u8, 145u8, 43u8, 190u8, 121u8, 59u8, 35u8, 195u8, 234u8, @@ -33610,7 +37090,7 @@ pub mod api { pub fn hrmp_channel_digests_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::hrmp_channel_digests::HrmpChannelDigests, (), ::subxt::storage::address::Yes, @@ -33619,7 +37099,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpChannelDigests", - vec![], + (), [ 90u8, 90u8, 139u8, 78u8, 47u8, 2u8, 104u8, 211u8, 42u8, 246u8, 193u8, 210u8, 142u8, 223u8, 17u8, 136u8, 3u8, 182u8, 25u8, 56u8, 72u8, 72u8, @@ -33637,7 +37117,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::hrmp_channel_digests::Param0, + >, types::hrmp_channel_digests::HrmpChannelDigests, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -33646,9 +37128,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Hrmp", "HrmpChannelDigests", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 90u8, 90u8, 139u8, 78u8, 47u8, 2u8, 104u8, 211u8, 42u8, 246u8, 193u8, 210u8, 142u8, 223u8, 17u8, 136u8, 3u8, 182u8, 25u8, 56u8, 72u8, 72u8, @@ -33701,7 +37181,7 @@ pub mod api { pub fn assignment_keys_unsafe( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::assignment_keys_unsafe::AssignmentKeysUnsafe, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -33710,7 +37190,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaSessionInfo", "AssignmentKeysUnsafe", - vec![], + (), [ 51u8, 155u8, 91u8, 101u8, 118u8, 243u8, 134u8, 138u8, 147u8, 59u8, 195u8, 186u8, 54u8, 187u8, 36u8, 14u8, 91u8, 141u8, 60u8, 139u8, 28u8, @@ -33722,7 +37202,7 @@ pub mod api { pub fn earliest_stored_session( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::earliest_stored_session::EarliestStoredSession, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -33731,7 +37211,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaSessionInfo", "EarliestStoredSession", - vec![], + (), [ 139u8, 176u8, 46u8, 139u8, 217u8, 35u8, 62u8, 91u8, 183u8, 7u8, 114u8, 226u8, 60u8, 237u8, 105u8, 73u8, 20u8, 216u8, 194u8, 205u8, 178u8, @@ -33745,7 +37225,7 @@ pub mod api { pub fn sessions_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::sessions::Sessions, (), (), @@ -33754,7 +37234,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaSessionInfo", "Sessions", - vec![], + (), [ 254u8, 40u8, 169u8, 18u8, 252u8, 203u8, 49u8, 182u8, 123u8, 19u8, 241u8, 150u8, 227u8, 153u8, 108u8, 109u8, 66u8, 129u8, 157u8, 27u8, @@ -33770,7 +37250,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::sessions::Sessions, ::subxt::storage::address::Yes, (), @@ -33779,9 +37259,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaSessionInfo", "Sessions", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 254u8, 40u8, 169u8, 18u8, 252u8, 203u8, 49u8, 182u8, 123u8, 19u8, 241u8, 150u8, 227u8, 153u8, 108u8, 109u8, 66u8, 129u8, 157u8, 27u8, @@ -33794,7 +37272,7 @@ pub mod api { pub fn account_keys_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::account_keys::AccountKeys, (), (), @@ -33803,7 +37281,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaSessionInfo", "AccountKeys", - vec![], + (), [ 30u8, 98u8, 58u8, 140u8, 96u8, 231u8, 205u8, 111u8, 194u8, 100u8, 185u8, 242u8, 210u8, 143u8, 110u8, 144u8, 170u8, 187u8, 62u8, 196u8, @@ -33817,7 +37295,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::account_keys::AccountKeys, ::subxt::storage::address::Yes, (), @@ -33826,9 +37304,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaSessionInfo", "AccountKeys", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 30u8, 98u8, 58u8, 140u8, 96u8, 231u8, 205u8, 111u8, 194u8, 100u8, 185u8, 242u8, 210u8, 143u8, 110u8, 144u8, 170u8, 187u8, 62u8, 196u8, @@ -33841,7 +37317,7 @@ pub mod api { pub fn session_executor_params_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::session_executor_params::SessionExecutorParams, (), (), @@ -33850,7 +37326,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaSessionInfo", "SessionExecutorParams", - vec![], + (), [ 38u8, 80u8, 118u8, 112u8, 189u8, 55u8, 95u8, 184u8, 19u8, 8u8, 114u8, 6u8, 173u8, 80u8, 254u8, 98u8, 107u8, 202u8, 215u8, 107u8, 149u8, @@ -33863,7 +37339,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::session_executor_params::Param0, + >, types::session_executor_params::SessionExecutorParams, ::subxt::storage::address::Yes, (), @@ -33872,9 +37350,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParaSessionInfo", "SessionExecutorParams", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 38u8, 80u8, 118u8, 112u8, 189u8, 55u8, 95u8, 184u8, 19u8, 8u8, 114u8, 6u8, 173u8, 80u8, 254u8, 98u8, 107u8, 202u8, 215u8, 107u8, 149u8, @@ -33908,7 +37384,6 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_unfreeze`]."] pub struct ForceUnfreeze; impl ::subxt::blocks::StaticExtrinsic for ForceUnfreeze { const PALLET: &'static str = "ParasDisputes"; @@ -33917,7 +37392,6 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::force_unfreeze`]."] pub fn force_unfreeze(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "ParasDisputes", @@ -34052,7 +37526,7 @@ pub mod api { pub fn last_pruned_session( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::last_pruned_session::LastPrunedSession, ::subxt::storage::address::Yes, (), @@ -34061,7 +37535,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasDisputes", "LastPrunedSession", - vec![], + (), [ 98u8, 107u8, 200u8, 158u8, 182u8, 120u8, 24u8, 242u8, 24u8, 163u8, 237u8, 72u8, 153u8, 19u8, 38u8, 85u8, 239u8, 208u8, 194u8, 22u8, 173u8, @@ -34074,7 +37548,7 @@ pub mod api { pub fn disputes_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::disputes::Disputes, (), (), @@ -34083,7 +37557,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasDisputes", "Disputes", - vec![], + (), [ 38u8, 237u8, 141u8, 222u8, 135u8, 82u8, 210u8, 166u8, 192u8, 122u8, 175u8, 96u8, 91u8, 1u8, 225u8, 182u8, 128u8, 4u8, 159u8, 56u8, 180u8, @@ -34097,7 +37571,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::disputes::Disputes, (), (), @@ -34106,9 +37580,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasDisputes", "Disputes", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 38u8, 237u8, 141u8, 222u8, 135u8, 82u8, 210u8, 166u8, 192u8, 122u8, 175u8, 96u8, 91u8, 1u8, 225u8, 182u8, 128u8, 4u8, 159u8, 56u8, 180u8, @@ -34123,7 +37595,10 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey, + ::subxt::storage::address::StaticStorageKey, + ), types::disputes::Disputes, ::subxt::storage::address::Yes, (), @@ -34132,10 +37607,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasDisputes", "Disputes", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 38u8, 237u8, 141u8, 222u8, 135u8, 82u8, 210u8, 166u8, 192u8, 122u8, 175u8, 96u8, 91u8, 1u8, 225u8, 182u8, 128u8, 4u8, 159u8, 56u8, 180u8, @@ -34149,7 +37624,7 @@ pub mod api { pub fn backers_on_disputes_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::backers_on_disputes::BackersOnDisputes, (), (), @@ -34158,7 +37633,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasDisputes", "BackersOnDisputes", - vec![], + (), [ 136u8, 171u8, 20u8, 204u8, 135u8, 153u8, 144u8, 241u8, 46u8, 193u8, 65u8, 22u8, 116u8, 161u8, 144u8, 186u8, 31u8, 194u8, 202u8, 225u8, @@ -34173,7 +37648,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::backers_on_disputes::BackersOnDisputes, (), (), @@ -34182,9 +37657,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasDisputes", "BackersOnDisputes", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 136u8, 171u8, 20u8, 204u8, 135u8, 153u8, 144u8, 241u8, 46u8, 193u8, 65u8, 22u8, 116u8, 161u8, 144u8, 186u8, 31u8, 194u8, 202u8, 225u8, @@ -34200,7 +37673,14 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey< + types::backers_on_disputes::Param0, + >, + ::subxt::storage::address::StaticStorageKey< + types::backers_on_disputes::Param1, + >, + ), types::backers_on_disputes::BackersOnDisputes, ::subxt::storage::address::Yes, (), @@ -34209,10 +37689,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasDisputes", "BackersOnDisputes", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 136u8, 171u8, 20u8, 204u8, 135u8, 153u8, 144u8, 241u8, 46u8, 193u8, 65u8, 22u8, 116u8, 161u8, 144u8, 186u8, 31u8, 194u8, 202u8, 225u8, @@ -34226,7 +37706,7 @@ pub mod api { pub fn included_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::included::Included, (), (), @@ -34235,7 +37715,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasDisputes", "Included", - vec![], + (), [ 47u8, 105u8, 189u8, 233u8, 206u8, 153u8, 162u8, 217u8, 141u8, 118u8, 31u8, 85u8, 87u8, 53u8, 100u8, 187u8, 31u8, 245u8, 50u8, 171u8, 4u8, @@ -34250,7 +37730,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::included::Included, (), (), @@ -34259,9 +37739,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasDisputes", "Included", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 47u8, 105u8, 189u8, 233u8, 206u8, 153u8, 162u8, 217u8, 141u8, 118u8, 31u8, 85u8, 87u8, 53u8, 100u8, 187u8, 31u8, 245u8, 50u8, 171u8, 4u8, @@ -34277,7 +37755,10 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey, + ::subxt::storage::address::StaticStorageKey, + ), types::included::Included, ::subxt::storage::address::Yes, (), @@ -34286,10 +37767,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasDisputes", "Included", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 47u8, 105u8, 189u8, 233u8, 206u8, 153u8, 162u8, 217u8, 141u8, 118u8, 31u8, 85u8, 87u8, 53u8, 100u8, 187u8, 31u8, 245u8, 50u8, 171u8, 4u8, @@ -34305,7 +37786,7 @@ pub mod api { pub fn frozen( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::frozen::Frozen, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -34314,7 +37795,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasDisputes", "Frozen", - vec![], + (), [ 245u8, 136u8, 43u8, 156u8, 7u8, 74u8, 31u8, 190u8, 184u8, 119u8, 182u8, 66u8, 18u8, 136u8, 30u8, 248u8, 24u8, 121u8, 26u8, 177u8, 169u8, 208u8, @@ -34350,7 +37831,6 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::report_dispute_lost_unsigned`]."] pub struct ReportDisputeLostUnsigned { pub dispute_proof: ::std::boxed::Box, @@ -34369,7 +37849,6 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::report_dispute_lost_unsigned`]."] pub fn report_dispute_lost_unsigned( &self, dispute_proof: types::report_dispute_lost_unsigned::DisputeProof, @@ -34415,7 +37894,7 @@ pub mod api { pub fn unapplied_slashes_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::unapplied_slashes::UnappliedSlashes, (), (), @@ -34424,7 +37903,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasSlashing", "UnappliedSlashes", - vec![], + (), [ 114u8, 171u8, 137u8, 142u8, 180u8, 125u8, 226u8, 240u8, 99u8, 181u8, 68u8, 221u8, 91u8, 124u8, 172u8, 93u8, 103u8, 12u8, 95u8, 43u8, 67u8, @@ -34438,7 +37917,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::unapplied_slashes::UnappliedSlashes, (), (), @@ -34447,9 +37926,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasSlashing", "UnappliedSlashes", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 114u8, 171u8, 137u8, 142u8, 180u8, 125u8, 226u8, 240u8, 99u8, 181u8, 68u8, 221u8, 91u8, 124u8, 172u8, 93u8, 103u8, 12u8, 95u8, 43u8, 67u8, @@ -34464,7 +37941,14 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey< + types::unapplied_slashes::Param0, + >, + ::subxt::storage::address::StaticStorageKey< + types::unapplied_slashes::Param1, + >, + ), types::unapplied_slashes::UnappliedSlashes, ::subxt::storage::address::Yes, (), @@ -34473,10 +37957,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasSlashing", "UnappliedSlashes", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 114u8, 171u8, 137u8, 142u8, 180u8, 125u8, 226u8, 240u8, 99u8, 181u8, 68u8, 221u8, 91u8, 124u8, 172u8, 93u8, 103u8, 12u8, 95u8, 43u8, 67u8, @@ -34489,7 +37973,7 @@ pub mod api { pub fn validator_set_counts_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::validator_set_counts::ValidatorSetCounts, (), (), @@ -34498,7 +37982,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasSlashing", "ValidatorSetCounts", - vec![], + (), [ 195u8, 220u8, 79u8, 140u8, 114u8, 80u8, 241u8, 103u8, 4u8, 7u8, 53u8, 100u8, 16u8, 78u8, 104u8, 171u8, 134u8, 110u8, 158u8, 191u8, 37u8, @@ -34511,7 +37995,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::validator_set_counts::Param0, + >, types::validator_set_counts::ValidatorSetCounts, ::subxt::storage::address::Yes, (), @@ -34520,9 +38006,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ParasSlashing", "ValidatorSetCounts", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 195u8, 220u8, 79u8, 140u8, 114u8, 80u8, 241u8, 103u8, 4u8, 7u8, 53u8, 100u8, 16u8, 78u8, 104u8, 171u8, 134u8, 110u8, 158u8, 191u8, 37u8, @@ -34556,7 +38040,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::reap_page`]."] + #[doc = "Remove a page which has no more messages remaining to be processed or is stale."] pub struct ReapPage { pub message_origin: reap_page::MessageOrigin, pub page_index: reap_page::PageIndex, @@ -34580,7 +38064,19 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::execute_overweight`]."] + #[doc = "Execute an overweight message."] + #[doc = ""] + #[doc = "Temporary processing errors will be propagated whereas permanent errors are treated"] + #[doc = "as success condition."] + #[doc = ""] + #[doc = "- `origin`: Must be `Signed`."] + #[doc = "- `message_origin`: The origin from which the message to be executed arrived."] + #[doc = "- `page`: The page in the queue in which the message to be executed is sitting."] + #[doc = "- `index`: The index into the queue of the message to be executed."] + #[doc = "- `weight_limit`: The maximum amount of weight allowed to be consumed in the execution"] + #[doc = " of the message."] + #[doc = ""] + #[doc = "Benchmark complexity considerations: O(index + weight_limit)."] pub struct ExecuteOverweight { pub message_origin: execute_overweight::MessageOrigin, pub page: execute_overweight::Page, @@ -34601,7 +38097,7 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::reap_page`]."] + #[doc = "Remove a page which has no more messages remaining to be processed or is stale."] pub fn reap_page( &self, message_origin: types::reap_page::MessageOrigin, @@ -34621,7 +38117,19 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::execute_overweight`]."] + #[doc = "Execute an overweight message."] + #[doc = ""] + #[doc = "Temporary processing errors will be propagated whereas permanent errors are treated"] + #[doc = "as success condition."] + #[doc = ""] + #[doc = "- `origin`: Must be `Signed`."] + #[doc = "- `message_origin`: The origin from which the message to be executed arrived."] + #[doc = "- `page`: The page in the queue in which the message to be executed is sitting."] + #[doc = "- `index`: The index into the queue of the message to be executed."] + #[doc = "- `weight_limit`: The maximum amount of weight allowed to be consumed in the execution"] + #[doc = " of the message."] + #[doc = ""] + #[doc = "Benchmark complexity considerations: O(index + weight_limit)."] pub fn execute_overweight( &self, message_origin: types::execute_overweight::MessageOrigin, @@ -34791,7 +38299,7 @@ pub mod api { pub fn book_state_for_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::book_state_for::BookStateFor, (), ::subxt::storage::address::Yes, @@ -34800,7 +38308,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "MessageQueue", "BookStateFor", - vec![], + (), [ 32u8, 61u8, 161u8, 81u8, 134u8, 136u8, 252u8, 113u8, 204u8, 115u8, 206u8, 180u8, 33u8, 185u8, 137u8, 155u8, 178u8, 189u8, 234u8, 201u8, @@ -34814,7 +38322,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::book_state_for::BookStateFor, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -34823,9 +38331,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "MessageQueue", "BookStateFor", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 32u8, 61u8, 161u8, 81u8, 134u8, 136u8, 252u8, 113u8, 204u8, 115u8, 206u8, 180u8, 33u8, 185u8, 137u8, 155u8, 178u8, 189u8, 234u8, 201u8, @@ -34838,7 +38344,7 @@ pub mod api { pub fn service_head( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::service_head::ServiceHead, ::subxt::storage::address::Yes, (), @@ -34847,7 +38353,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "MessageQueue", "ServiceHead", - vec![], + (), [ 17u8, 130u8, 229u8, 193u8, 127u8, 237u8, 60u8, 232u8, 99u8, 109u8, 102u8, 228u8, 124u8, 103u8, 24u8, 188u8, 151u8, 121u8, 55u8, 97u8, @@ -34860,7 +38366,7 @@ pub mod api { pub fn pages_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::pages::Pages, (), (), @@ -34869,7 +38375,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "MessageQueue", "Pages", - vec![], + (), [ 56u8, 181u8, 157u8, 16u8, 157u8, 123u8, 106u8, 93u8, 199u8, 208u8, 153u8, 53u8, 168u8, 188u8, 124u8, 77u8, 140u8, 163u8, 113u8, 16u8, @@ -34883,7 +38389,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::pages::Pages, (), (), @@ -34892,9 +38398,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "MessageQueue", "Pages", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 56u8, 181u8, 157u8, 16u8, 157u8, 123u8, 106u8, 93u8, 199u8, 208u8, 153u8, 53u8, 168u8, 188u8, 124u8, 77u8, 140u8, 163u8, 113u8, 16u8, @@ -34909,7 +38413,10 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey, + ::subxt::storage::address::StaticStorageKey, + ), types::pages::Pages, ::subxt::storage::address::Yes, (), @@ -34918,10 +38425,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "MessageQueue", "Pages", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 56u8, 181u8, 157u8, 16u8, 157u8, 123u8, 106u8, 93u8, 199u8, 208u8, 153u8, 53u8, 168u8, 188u8, 124u8, 77u8, 140u8, 163u8, 113u8, 16u8, @@ -35016,7 +38523,22 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::place_order_allow_death`]."] + #[doc = "Create a single on demand core order."] + #[doc = "Will use the spot price for the current block and will reap the account if needed."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `origin`: The sender of the call, funds will be withdrawn from this account."] + #[doc = "- `max_amount`: The maximum balance to withdraw from the origin to place an order."] + #[doc = "- `para_id`: A `ParaId` the origin wants to provide blockspace for."] + #[doc = ""] + #[doc = "Errors:"] + #[doc = "- `InsufficientBalance`: from the Currency implementation"] + #[doc = "- `InvalidParaId`"] + #[doc = "- `QueueFull`"] + #[doc = "- `SpotPriceHigherThanMaxAmount`"] + #[doc = ""] + #[doc = "Events:"] + #[doc = "- `SpotOrderPlaced`"] pub struct PlaceOrderAllowDeath { pub max_amount: place_order_allow_death::MaxAmount, pub para_id: place_order_allow_death::ParaId, @@ -35040,7 +38562,22 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::place_order_keep_alive`]."] + #[doc = "Same as the [`place_order_allow_death`](Self::place_order_allow_death) call , but with a"] + #[doc = "check that placing the order will not reap the account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `origin`: The sender of the call, funds will be withdrawn from this account."] + #[doc = "- `max_amount`: The maximum balance to withdraw from the origin to place an order."] + #[doc = "- `para_id`: A `ParaId` the origin wants to provide blockspace for."] + #[doc = ""] + #[doc = "Errors:"] + #[doc = "- `InsufficientBalance`: from the Currency implementation"] + #[doc = "- `InvalidParaId`"] + #[doc = "- `QueueFull`"] + #[doc = "- `SpotPriceHigherThanMaxAmount`"] + #[doc = ""] + #[doc = "Events:"] + #[doc = "- `SpotOrderPlaced`"] pub struct PlaceOrderKeepAlive { pub max_amount: place_order_keep_alive::MaxAmount, pub para_id: place_order_keep_alive::ParaId, @@ -35057,7 +38594,22 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::place_order_allow_death`]."] + #[doc = "Create a single on demand core order."] + #[doc = "Will use the spot price for the current block and will reap the account if needed."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `origin`: The sender of the call, funds will be withdrawn from this account."] + #[doc = "- `max_amount`: The maximum balance to withdraw from the origin to place an order."] + #[doc = "- `para_id`: A `ParaId` the origin wants to provide blockspace for."] + #[doc = ""] + #[doc = "Errors:"] + #[doc = "- `InsufficientBalance`: from the Currency implementation"] + #[doc = "- `InvalidParaId`"] + #[doc = "- `QueueFull`"] + #[doc = "- `SpotPriceHigherThanMaxAmount`"] + #[doc = ""] + #[doc = "Events:"] + #[doc = "- `SpotOrderPlaced`"] pub fn place_order_allow_death( &self, max_amount: types::place_order_allow_death::MaxAmount, @@ -35078,7 +38630,22 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::place_order_keep_alive`]."] + #[doc = "Same as the [`place_order_allow_death`](Self::place_order_allow_death) call , but with a"] + #[doc = "check that placing the order will not reap the account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `origin`: The sender of the call, funds will be withdrawn from this account."] + #[doc = "- `max_amount`: The maximum balance to withdraw from the origin to place an order."] + #[doc = "- `para_id`: A `ParaId` the origin wants to provide blockspace for."] + #[doc = ""] + #[doc = "Errors:"] + #[doc = "- `InsufficientBalance`: from the Currency implementation"] + #[doc = "- `InvalidParaId`"] + #[doc = "- `QueueFull`"] + #[doc = "- `SpotPriceHigherThanMaxAmount`"] + #[doc = ""] + #[doc = "Events:"] + #[doc = "- `SpotOrderPlaced`"] pub fn place_order_keep_alive( &self, max_amount: types::place_order_keep_alive::MaxAmount, @@ -35177,7 +38744,7 @@ pub mod api { pub fn spot_traffic( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::spot_traffic::SpotTraffic, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -35186,7 +38753,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "OnDemandAssignmentProvider", "SpotTraffic", - vec![], + (), [ 8u8, 236u8, 233u8, 156u8, 211u8, 45u8, 192u8, 58u8, 108u8, 247u8, 47u8, 97u8, 229u8, 26u8, 188u8, 67u8, 98u8, 43u8, 11u8, 11u8, 1u8, 127u8, @@ -35199,7 +38766,7 @@ pub mod api { pub fn on_demand_queue( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::on_demand_queue::OnDemandQueue, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -35208,7 +38775,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "OnDemandAssignmentProvider", "OnDemandQueue", - vec![], + (), [ 241u8, 10u8, 89u8, 240u8, 227u8, 90u8, 218u8, 35u8, 80u8, 244u8, 219u8, 112u8, 177u8, 143u8, 43u8, 228u8, 224u8, 165u8, 217u8, 65u8, 17u8, @@ -35223,7 +38790,7 @@ pub mod api { pub fn para_id_affinity_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::para_id_affinity::ParaIdAffinity, (), (), @@ -35232,7 +38799,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "OnDemandAssignmentProvider", "ParaIdAffinity", - vec![], + (), [ 145u8, 117u8, 2u8, 170u8, 99u8, 68u8, 166u8, 236u8, 247u8, 80u8, 202u8, 87u8, 116u8, 244u8, 218u8, 172u8, 41u8, 187u8, 170u8, 163u8, 187u8, @@ -35247,7 +38814,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::para_id_affinity::ParaIdAffinity, ::subxt::storage::address::Yes, (), @@ -35256,9 +38823,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "OnDemandAssignmentProvider", "ParaIdAffinity", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + (), [ 145u8, 117u8, 2u8, 170u8, 99u8, 68u8, 166u8, 236u8, 247u8, 80u8, 202u8, 87u8, 116u8, 244u8, 218u8, 172u8, 41u8, 187u8, 170u8, 163u8, 187u8, @@ -35291,10 +38856,6 @@ pub mod api { } } } - pub mod parachains_assignment_provider { - use super::root_mod; - use super::runtime_types; - } pub mod coretime_assignment_provider { use super::root_mod; use super::runtime_types; @@ -35329,7 +38890,7 @@ pub mod api { pub fn core_schedules_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::core_schedules::CoreSchedules, (), (), @@ -35338,7 +38899,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "CoretimeAssignmentProvider", "CoreSchedules", - vec![], + (), [ 34u8, 85u8, 91u8, 158u8, 28u8, 200u8, 76u8, 188u8, 253u8, 91u8, 153u8, 42u8, 42u8, 227u8, 119u8, 181u8, 247u8, 44u8, 29u8, 24u8, 128u8, 49u8, @@ -35354,7 +38915,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::core_schedules::CoreSchedules, (), (), @@ -35363,9 +38924,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "CoretimeAssignmentProvider", "CoreSchedules", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + (), [ 34u8, 85u8, 91u8, 158u8, 28u8, 200u8, 76u8, 188u8, 253u8, 91u8, 153u8, 42u8, 42u8, 227u8, 119u8, 181u8, 247u8, 44u8, 29u8, 24u8, 128u8, 49u8, @@ -35382,7 +38941,7 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ((), ()), types::core_schedules::CoreSchedules, ::subxt::storage::address::Yes, (), @@ -35391,10 +38950,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "CoretimeAssignmentProvider", "CoreSchedules", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ((), ()), [ 34u8, 85u8, 91u8, 158u8, 28u8, 200u8, 76u8, 188u8, 253u8, 91u8, 153u8, 42u8, 42u8, 227u8, 119u8, 181u8, 247u8, 44u8, 29u8, 24u8, 128u8, 49u8, @@ -35409,7 +38965,7 @@ pub mod api { pub fn core_descriptors_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::core_descriptors::CoreDescriptors, (), ::subxt::storage::address::Yes, @@ -35418,7 +38974,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "CoretimeAssignmentProvider", "CoreDescriptors", - vec![], + (), [ 1u8, 90u8, 208u8, 119u8, 150u8, 241u8, 133u8, 74u8, 22u8, 166u8, 13u8, 7u8, 73u8, 136u8, 105u8, 61u8, 251u8, 245u8, 164u8, 7u8, 45u8, 68u8, @@ -35434,7 +38990,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::core_descriptors::CoreDescriptors, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -35443,9 +38999,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "CoretimeAssignmentProvider", "CoreDescriptors", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + (), [ 1u8, 90u8, 208u8, 119u8, 150u8, 241u8, 133u8, 74u8, 22u8, 166u8, 13u8, 7u8, 73u8, 136u8, 105u8, 61u8, 251u8, 245u8, 164u8, 7u8, 45u8, 68u8, @@ -35479,7 +39033,26 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::register`]."] + #[doc = "Register head data and validation code for a reserved Para Id."] + #[doc = ""] + #[doc = "## Arguments"] + #[doc = "- `origin`: Must be called by a `Signed` origin."] + #[doc = "- `id`: The para ID. Must be owned/managed by the `origin` signing account."] + #[doc = "- `genesis_head`: The genesis head data of the parachain/thread."] + #[doc = "- `validation_code`: The initial validation code of the parachain/thread."] + #[doc = ""] + #[doc = "## Deposits/Fees"] + #[doc = "The account with the originating signature must reserve a deposit."] + #[doc = ""] + #[doc = "The deposit is required to cover the costs associated with storing the genesis head"] + #[doc = "data and the validation code."] + #[doc = "This accounts for the potential to store validation code of a size up to the"] + #[doc = "`max_code_size`, as defined in the configuration pallet"] + #[doc = ""] + #[doc = "Anything already reserved previously for this para ID is accounted for."] + #[doc = ""] + #[doc = "## Events"] + #[doc = "The `Registered` event is emitted in case of success."] pub struct Register { pub id: register::Id, pub genesis_head: register::GenesisHead, @@ -35507,7 +39080,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_register`]."] + #[doc = "Force the registration of a Para Id on the relay chain."] + #[doc = ""] + #[doc = "This function must be called by a Root origin."] + #[doc = ""] + #[doc = "The deposit taken can be specified for this registration. Any `ParaId`"] + #[doc = "can be registered, including sub-1000 IDs which are System Parachains."] pub struct ForceRegister { pub who: force_register::Who, pub deposit: force_register::Deposit, @@ -35539,7 +39117,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::deregister`]."] + #[doc = "Deregister a Para Id, freeing all data and returning any deposit."] + #[doc = ""] + #[doc = "The caller must be Root, the `para` owner, or the `para` itself. The para must be an"] + #[doc = "on-demand parachain."] pub struct Deregister { pub id: deregister::Id, } @@ -35561,7 +39142,18 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::swap`]."] + #[doc = "Swap a lease holding parachain with another parachain, either on-demand or lease"] + #[doc = "holding."] + #[doc = ""] + #[doc = "The origin must be Root, the `para` owner, or the `para` itself."] + #[doc = ""] + #[doc = "The swap will happen only if there is already an opposite swap pending. If there is not,"] + #[doc = "the swap will be stored in the pending swaps map, ready for a later confirmatory swap."] + #[doc = ""] + #[doc = "The `ParaId`s remain mapped to the same head data and code so external code can rely on"] + #[doc = "`ParaId` to be a long-term identifier of a notional \"parachain\". However, their"] + #[doc = "scheduling info (i.e. whether they're an on-demand parachain or lease holding"] + #[doc = "parachain), auction information and the auction deposit are switched."] pub struct Swap { pub id: swap::Id, pub other: swap::Other, @@ -35585,7 +39177,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove_lock`]."] + #[doc = "Remove a manager lock from a para. This will allow the manager of a"] + #[doc = "previously locked para to deregister or swap a para without using governance."] + #[doc = ""] + #[doc = "Can only be called by the Root origin or the parachain."] pub struct RemoveLock { pub para: remove_lock::Para, } @@ -35607,7 +39202,23 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::reserve`]."] + #[doc = "Reserve a Para Id on the relay chain."] + #[doc = ""] + #[doc = "This function will reserve a new Para Id to be owned/managed by the origin account."] + #[doc = "The origin account is able to register head data and validation code using `register` to"] + #[doc = "create an on-demand parachain. Using the Slots pallet, an on-demand parachain can then"] + #[doc = "be upgraded to a lease holding parachain."] + #[doc = ""] + #[doc = "## Arguments"] + #[doc = "- `origin`: Must be called by a `Signed` origin. Becomes the manager/owner of the new"] + #[doc = " para ID."] + #[doc = ""] + #[doc = "## Deposits/Fees"] + #[doc = "The origin must reserve a deposit of `ParaDeposit` for the registration."] + #[doc = ""] + #[doc = "## Events"] + #[doc = "The `Reserved` event is emitted in case of success, which provides the ID reserved for"] + #[doc = "use."] pub struct Reserve; impl ::subxt::blocks::StaticExtrinsic for Reserve { const PALLET: &'static str = "Registrar"; @@ -35623,7 +39234,11 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::add_lock`]."] + #[doc = "Add a manager lock from a para. This will prevent the manager of a"] + #[doc = "para to deregister or swap a para."] + #[doc = ""] + #[doc = "Can be called by Root, the parachain, or the parachain manager if the parachain is"] + #[doc = "unlocked."] pub struct AddLock { pub para: add_lock::Para, } @@ -35645,7 +39260,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::schedule_code_upgrade`]."] + #[doc = "Schedule a parachain upgrade."] + #[doc = ""] + #[doc = "Can be called by Root, the parachain, or the parachain manager if the parachain is"] + #[doc = "unlocked."] pub struct ScheduleCodeUpgrade { pub para: schedule_code_upgrade::Para, pub new_code: schedule_code_upgrade::NewCode, @@ -35670,7 +39288,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_current_head`]."] + #[doc = "Set the parachain's current head."] + #[doc = ""] + #[doc = "Can be called by Root, the parachain, or the parachain manager if the parachain is"] + #[doc = "unlocked."] pub struct SetCurrentHead { pub para: set_current_head::Para, pub new_head: set_current_head::NewHead, @@ -35688,7 +39309,26 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::register`]."] + #[doc = "Register head data and validation code for a reserved Para Id."] + #[doc = ""] + #[doc = "## Arguments"] + #[doc = "- `origin`: Must be called by a `Signed` origin."] + #[doc = "- `id`: The para ID. Must be owned/managed by the `origin` signing account."] + #[doc = "- `genesis_head`: The genesis head data of the parachain/thread."] + #[doc = "- `validation_code`: The initial validation code of the parachain/thread."] + #[doc = ""] + #[doc = "## Deposits/Fees"] + #[doc = "The account with the originating signature must reserve a deposit."] + #[doc = ""] + #[doc = "The deposit is required to cover the costs associated with storing the genesis head"] + #[doc = "data and the validation code."] + #[doc = "This accounts for the potential to store validation code of a size up to the"] + #[doc = "`max_code_size`, as defined in the configuration pallet"] + #[doc = ""] + #[doc = "Anything already reserved previously for this para ID is accounted for."] + #[doc = ""] + #[doc = "## Events"] + #[doc = "The `Registered` event is emitted in case of success."] pub fn register( &self, id: types::register::Id, @@ -35710,7 +39350,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_register`]."] + #[doc = "Force the registration of a Para Id on the relay chain."] + #[doc = ""] + #[doc = "This function must be called by a Root origin."] + #[doc = ""] + #[doc = "The deposit taken can be specified for this registration. Any `ParaId`"] + #[doc = "can be registered, including sub-1000 IDs which are System Parachains."] pub fn force_register( &self, who: types::force_register::Who, @@ -35737,7 +39382,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::deregister`]."] + #[doc = "Deregister a Para Id, freeing all data and returning any deposit."] + #[doc = ""] + #[doc = "The caller must be Root, the `para` owner, or the `para` itself. The para must be an"] + #[doc = "on-demand parachain."] pub fn deregister( &self, id: types::deregister::Id, @@ -35753,7 +39401,18 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::swap`]."] + #[doc = "Swap a lease holding parachain with another parachain, either on-demand or lease"] + #[doc = "holding."] + #[doc = ""] + #[doc = "The origin must be Root, the `para` owner, or the `para` itself."] + #[doc = ""] + #[doc = "The swap will happen only if there is already an opposite swap pending. If there is not,"] + #[doc = "the swap will be stored in the pending swaps map, ready for a later confirmatory swap."] + #[doc = ""] + #[doc = "The `ParaId`s remain mapped to the same head data and code so external code can rely on"] + #[doc = "`ParaId` to be a long-term identifier of a notional \"parachain\". However, their"] + #[doc = "scheduling info (i.e. whether they're an on-demand parachain or lease holding"] + #[doc = "parachain), auction information and the auction deposit are switched."] pub fn swap( &self, id: types::swap::Id, @@ -35771,7 +39430,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::remove_lock`]."] + #[doc = "Remove a manager lock from a para. This will allow the manager of a"] + #[doc = "previously locked para to deregister or swap a para without using governance."] + #[doc = ""] + #[doc = "Can only be called by the Root origin or the parachain."] pub fn remove_lock( &self, para: types::remove_lock::Para, @@ -35787,7 +39449,23 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::reserve`]."] + #[doc = "Reserve a Para Id on the relay chain."] + #[doc = ""] + #[doc = "This function will reserve a new Para Id to be owned/managed by the origin account."] + #[doc = "The origin account is able to register head data and validation code using `register` to"] + #[doc = "create an on-demand parachain. Using the Slots pallet, an on-demand parachain can then"] + #[doc = "be upgraded to a lease holding parachain."] + #[doc = ""] + #[doc = "## Arguments"] + #[doc = "- `origin`: Must be called by a `Signed` origin. Becomes the manager/owner of the new"] + #[doc = " para ID."] + #[doc = ""] + #[doc = "## Deposits/Fees"] + #[doc = "The origin must reserve a deposit of `ParaDeposit` for the registration."] + #[doc = ""] + #[doc = "## Events"] + #[doc = "The `Reserved` event is emitted in case of success, which provides the ID reserved for"] + #[doc = "use."] pub fn reserve(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Registrar", @@ -35800,7 +39478,11 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::add_lock`]."] + #[doc = "Add a manager lock from a para. This will prevent the manager of a"] + #[doc = "para to deregister or swap a para."] + #[doc = ""] + #[doc = "Can be called by Root, the parachain, or the parachain manager if the parachain is"] + #[doc = "unlocked."] pub fn add_lock( &self, para: types::add_lock::Para, @@ -35816,7 +39498,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::schedule_code_upgrade`]."] + #[doc = "Schedule a parachain upgrade."] + #[doc = ""] + #[doc = "Can be called by Root, the parachain, or the parachain manager if the parachain is"] + #[doc = "unlocked."] pub fn schedule_code_upgrade( &self, para: types::schedule_code_upgrade::Para, @@ -35834,7 +39519,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_current_head`]."] + #[doc = "Set the parachain's current head."] + #[doc = ""] + #[doc = "Can be called by Root, the parachain, or the parachain manager if the parachain is"] + #[doc = "unlocked."] pub fn set_current_head( &self, para: types::set_current_head::Para, @@ -35980,7 +39668,7 @@ pub mod api { pub fn pending_swap_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::pending_swap::PendingSwap, (), (), @@ -35989,7 +39677,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Registrar", "PendingSwap", - vec![], + (), [ 75u8, 6u8, 68u8, 43u8, 108u8, 147u8, 220u8, 90u8, 190u8, 86u8, 209u8, 141u8, 9u8, 254u8, 103u8, 10u8, 94u8, 187u8, 155u8, 249u8, 140u8, @@ -36003,7 +39691,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::pending_swap::PendingSwap, ::subxt::storage::address::Yes, (), @@ -36012,9 +39700,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Registrar", "PendingSwap", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 75u8, 6u8, 68u8, 43u8, 108u8, 147u8, 220u8, 90u8, 190u8, 86u8, 209u8, 141u8, 9u8, 254u8, 103u8, 10u8, 94u8, 187u8, 155u8, 249u8, 140u8, @@ -36030,7 +39716,7 @@ pub mod api { pub fn paras_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::paras::Paras, (), (), @@ -36039,7 +39725,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Registrar", "Paras", - vec![], + (), [ 125u8, 62u8, 50u8, 209u8, 40u8, 170u8, 61u8, 62u8, 61u8, 246u8, 103u8, 229u8, 213u8, 94u8, 249u8, 49u8, 18u8, 90u8, 138u8, 14u8, 101u8, 133u8, @@ -36055,7 +39741,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::paras::Paras, ::subxt::storage::address::Yes, (), @@ -36064,9 +39750,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Registrar", "Paras", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 125u8, 62u8, 50u8, 209u8, 40u8, 170u8, 61u8, 62u8, 61u8, 246u8, 103u8, 229u8, 213u8, 94u8, 249u8, 49u8, 18u8, 90u8, 138u8, 14u8, 101u8, 133u8, @@ -36078,7 +39762,7 @@ pub mod api { pub fn next_free_para_id( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::next_free_para_id::NextFreeParaId, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -36087,7 +39771,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Registrar", "NextFreeParaId", - vec![], + (), [ 52u8, 14u8, 56u8, 196u8, 79u8, 221u8, 32u8, 14u8, 154u8, 247u8, 94u8, 219u8, 11u8, 11u8, 104u8, 137u8, 167u8, 195u8, 180u8, 101u8, 35u8, @@ -36155,7 +39839,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_lease`]."] + #[doc = "Just a connect into the `lease_out` call, in case Root wants to force some lease to"] + #[doc = "happen independently of any other on-chain mechanism to use it."] + #[doc = ""] + #[doc = "The dispatch origin for this call must match `T::ForceOrigin`."] pub struct ForceLease { pub para: force_lease::Para, pub leaser: force_lease::Leaser, @@ -36185,7 +39872,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::clear_all_leases`]."] + #[doc = "Clear all leases for a Para Id, refunding any deposits back to the original owners."] + #[doc = ""] + #[doc = "The dispatch origin for this call must match `T::ForceOrigin`."] pub struct ClearAllLeases { pub para: clear_all_leases::Para, } @@ -36207,7 +39896,13 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::trigger_onboard`]."] + #[doc = "Try to onboard a parachain that has a lease for the current lease period."] + #[doc = ""] + #[doc = "This function can be useful if there was some state issue with a para that should"] + #[doc = "have onboarded, but was unable to. As long as they have a lease period, we can"] + #[doc = "let them onboard from here."] + #[doc = ""] + #[doc = "Origin must be signed, but can be called by anyone."] pub struct TriggerOnboard { pub para: trigger_onboard::Para, } @@ -36222,7 +39917,10 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::force_lease`]."] + #[doc = "Just a connect into the `lease_out` call, in case Root wants to force some lease to"] + #[doc = "happen independently of any other on-chain mechanism to use it."] + #[doc = ""] + #[doc = "The dispatch origin for this call must match `T::ForceOrigin`."] pub fn force_lease( &self, para: types::force_lease::Para, @@ -36249,7 +39947,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::clear_all_leases`]."] + #[doc = "Clear all leases for a Para Id, refunding any deposits back to the original owners."] + #[doc = ""] + #[doc = "The dispatch origin for this call must match `T::ForceOrigin`."] pub fn clear_all_leases( &self, para: types::clear_all_leases::Para, @@ -36265,7 +39965,13 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::trigger_onboard`]."] + #[doc = "Try to onboard a parachain that has a lease for the current lease period."] + #[doc = ""] + #[doc = "This function can be useful if there was some state issue with a para that should"] + #[doc = "have onboarded, but was unable to. As long as they have a lease period, we can"] + #[doc = "let them onboard from here."] + #[doc = ""] + #[doc = "Origin must be signed, but can be called by anyone."] pub fn trigger_onboard( &self, para: types::trigger_onboard::Para, @@ -36380,7 +40086,7 @@ pub mod api { pub fn leases_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::leases::Leases, (), ::subxt::storage::address::Yes, @@ -36389,7 +40095,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Slots", "Leases", - vec![], + (), [ 233u8, 226u8, 181u8, 160u8, 216u8, 86u8, 238u8, 229u8, 31u8, 67u8, 200u8, 188u8, 134u8, 22u8, 88u8, 147u8, 204u8, 11u8, 34u8, 244u8, @@ -36418,7 +40124,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::leases::Leases, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -36427,9 +40133,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Slots", "Leases", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 233u8, 226u8, 181u8, 160u8, 216u8, 86u8, 238u8, 229u8, 31u8, 67u8, 200u8, 188u8, 134u8, 22u8, 88u8, 147u8, 204u8, 11u8, 34u8, 244u8, @@ -36496,7 +40200,11 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::new_auction`]."] + #[doc = "Create a new auction."] + #[doc = ""] + #[doc = "This can only happen when there isn't already an auction in progress and may only be"] + #[doc = "called by the root origin. Accepts the `duration` of this auction and the"] + #[doc = "`lease_period_index` of the initial lease period of the four that are to be auctioned."] pub struct NewAuction { #[codec(compact)] pub duration: new_auction::Duration, @@ -36522,7 +40230,22 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::bid`]."] + #[doc = "Make a new bid from an account (including a parachain account) for deploying a new"] + #[doc = "parachain."] + #[doc = ""] + #[doc = "Multiple simultaneous bids from the same bidder are allowed only as long as all active"] + #[doc = "bids overlap each other (i.e. are mutually exclusive). Bids cannot be redacted."] + #[doc = ""] + #[doc = "- `sub` is the sub-bidder ID, allowing for multiple competing bids to be made by (and"] + #[doc = "funded by) the same account."] + #[doc = "- `auction_index` is the index of the auction to bid on. Should just be the present"] + #[doc = "value of `AuctionCounter`."] + #[doc = "- `first_slot` is the first lease period index of the range to bid on. This is the"] + #[doc = "absolute lease period index value, not an auction-specific offset."] + #[doc = "- `last_slot` is the last lease period index of the range to bid on. This is the"] + #[doc = "absolute lease period index value, not an auction-specific offset."] + #[doc = "- `amount` is the amount to bid to be held as deposit for the parachain should the"] + #[doc = "bid win. This amount is held throughout the range."] pub struct Bid { #[codec(compact)] pub para: bid::Para, @@ -36557,7 +40280,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::cancel_auction`]."] + #[doc = "Cancel an in-progress auction."] + #[doc = ""] + #[doc = "Can only be called by Root origin."] pub struct CancelAuction; impl ::subxt::blocks::StaticExtrinsic for CancelAuction { const PALLET: &'static str = "Auctions"; @@ -36566,7 +40291,11 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::new_auction`]."] + #[doc = "Create a new auction."] + #[doc = ""] + #[doc = "This can only happen when there isn't already an auction in progress and may only be"] + #[doc = "called by the root origin. Accepts the `duration` of this auction and the"] + #[doc = "`lease_period_index` of the initial lease period of the four that are to be auctioned."] pub fn new_auction( &self, duration: types::new_auction::Duration, @@ -36587,7 +40316,22 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::bid`]."] + #[doc = "Make a new bid from an account (including a parachain account) for deploying a new"] + #[doc = "parachain."] + #[doc = ""] + #[doc = "Multiple simultaneous bids from the same bidder are allowed only as long as all active"] + #[doc = "bids overlap each other (i.e. are mutually exclusive). Bids cannot be redacted."] + #[doc = ""] + #[doc = "- `sub` is the sub-bidder ID, allowing for multiple competing bids to be made by (and"] + #[doc = "funded by) the same account."] + #[doc = "- `auction_index` is the index of the auction to bid on. Should just be the present"] + #[doc = "value of `AuctionCounter`."] + #[doc = "- `first_slot` is the first lease period index of the range to bid on. This is the"] + #[doc = "absolute lease period index value, not an auction-specific offset."] + #[doc = "- `last_slot` is the last lease period index of the range to bid on. This is the"] + #[doc = "absolute lease period index value, not an auction-specific offset."] + #[doc = "- `amount` is the amount to bid to be held as deposit for the parachain should the"] + #[doc = "bid win. This amount is held throughout the range."] pub fn bid( &self, para: types::bid::Para, @@ -36613,7 +40357,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::cancel_auction`]."] + #[doc = "Cancel an in-progress auction."] + #[doc = ""] + #[doc = "Can only be called by Root origin."] pub fn cancel_auction(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Auctions", @@ -36849,7 +40595,7 @@ pub mod api { pub fn auction_counter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::auction_counter::AuctionCounter, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -36858,7 +40604,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Auctions", "AuctionCounter", - vec![], + (), [ 110u8, 243u8, 85u8, 4u8, 127u8, 111u8, 101u8, 167u8, 72u8, 129u8, 201u8, 250u8, 88u8, 9u8, 79u8, 14u8, 152u8, 132u8, 0u8, 204u8, 112u8, @@ -36874,7 +40620,7 @@ pub mod api { pub fn auction_info( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::auction_info::AuctionInfo, ::subxt::storage::address::Yes, (), @@ -36883,7 +40629,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Auctions", "AuctionInfo", - vec![], + (), [ 116u8, 81u8, 223u8, 26u8, 151u8, 103u8, 209u8, 182u8, 169u8, 173u8, 220u8, 234u8, 88u8, 191u8, 255u8, 75u8, 148u8, 75u8, 167u8, 37u8, 6u8, @@ -36896,7 +40642,7 @@ pub mod api { pub fn reserved_amounts_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::reserved_amounts::ReservedAmounts, (), (), @@ -36905,7 +40651,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Auctions", "ReservedAmounts", - vec![], + (), [ 77u8, 44u8, 116u8, 36u8, 189u8, 213u8, 126u8, 32u8, 42u8, 131u8, 108u8, 41u8, 147u8, 40u8, 247u8, 245u8, 161u8, 42u8, 152u8, 195u8, 28u8, @@ -36920,7 +40666,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::reserved_amounts::ReservedAmounts, (), (), @@ -36929,9 +40675,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Auctions", "ReservedAmounts", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 77u8, 44u8, 116u8, 36u8, 189u8, 213u8, 126u8, 32u8, 42u8, 131u8, 108u8, 41u8, 147u8, 40u8, 247u8, 245u8, 161u8, 42u8, 152u8, 195u8, 28u8, @@ -36947,7 +40691,14 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey< + types::reserved_amounts::Param0, + >, + ::subxt::storage::address::StaticStorageKey< + types::reserved_amounts::Param1, + >, + ), types::reserved_amounts::ReservedAmounts, ::subxt::storage::address::Yes, (), @@ -36956,10 +40707,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Auctions", "ReservedAmounts", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 77u8, 44u8, 116u8, 36u8, 189u8, 213u8, 126u8, 32u8, 42u8, 131u8, 108u8, 41u8, 147u8, 40u8, 247u8, 245u8, 161u8, 42u8, 152u8, 195u8, 28u8, @@ -36974,7 +40725,7 @@ pub mod api { pub fn winning_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::winning::Winning, (), (), @@ -36983,7 +40734,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Auctions", "Winning", - vec![], + (), [ 8u8, 136u8, 174u8, 152u8, 223u8, 1u8, 143u8, 45u8, 213u8, 5u8, 239u8, 163u8, 152u8, 99u8, 197u8, 109u8, 194u8, 140u8, 246u8, 10u8, 40u8, @@ -36998,7 +40749,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::winning::Winning, ::subxt::storage::address::Yes, (), @@ -37007,9 +40758,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Auctions", "Winning", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 8u8, 136u8, 174u8, 152u8, 223u8, 1u8, 143u8, 45u8, 213u8, 5u8, 239u8, 163u8, 152u8, 99u8, 197u8, 109u8, 194u8, 140u8, 246u8, 10u8, 40u8, @@ -37105,7 +40854,11 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::create`]."] + #[doc = "Create a new crowdloaning campaign for a parachain slot with the given lease period"] + #[doc = "range."] + #[doc = ""] + #[doc = "This applies a lock to your parachain configuration, ensuring that it cannot be changed"] + #[doc = "by the parachain manager."] pub struct Create { #[codec(compact)] pub index: create::Index, @@ -37143,7 +40896,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::contribute`]."] + #[doc = "Contribute to a crowd sale. This will transfer some balance over to fund a parachain"] + #[doc = "slot. It will be withdrawable when the crowdloan has ended and the funds are unused."] pub struct Contribute { #[codec(compact)] pub index: contribute::Index, @@ -37172,7 +40926,23 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::withdraw`]."] + #[doc = "Withdraw full balance of a specific contributor."] + #[doc = ""] + #[doc = "Origin must be signed, but can come from anyone."] + #[doc = ""] + #[doc = "The fund must be either in, or ready for, retirement. For a fund to be *in* retirement,"] + #[doc = "then the retirement flag must be set. For a fund to be ready for retirement, then:"] + #[doc = "- it must not already be in retirement;"] + #[doc = "- the amount of raised funds must be bigger than the _free_ balance of the account;"] + #[doc = "- and either:"] + #[doc = " - the block number must be at least `end`; or"] + #[doc = " - the current lease period must be greater than the fund's `last_period`."] + #[doc = ""] + #[doc = "In this case, the fund's retirement flag is set and its `end` is reset to the current"] + #[doc = "block number."] + #[doc = ""] + #[doc = "- `who`: The account whose contribution should be withdrawn."] + #[doc = "- `index`: The parachain to whose crowdloan the contribution was made."] pub struct Withdraw { pub who: withdraw::Who, #[codec(compact)] @@ -37197,7 +40967,11 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::refund`]."] + #[doc = "Automatically refund contributors of an ended crowdloan."] + #[doc = "Due to weight restrictions, this function may need to be called multiple"] + #[doc = "times to fully refund all users. We will refund `RemoveKeysLimit` users at a time."] + #[doc = ""] + #[doc = "Origin must be signed, but can come from anyone."] pub struct Refund { #[codec(compact)] pub index: refund::Index, @@ -37220,7 +40994,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::dissolve`]."] + #[doc = "Remove a fund after the retirement period has ended and all funds have been returned."] pub struct Dissolve { #[codec(compact)] pub index: dissolve::Index, @@ -37243,7 +41017,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::edit`]."] + #[doc = "Edit the configuration for an in-progress crowdloan."] + #[doc = ""] + #[doc = "Can only be called by Root origin."] pub struct Edit { #[codec(compact)] pub index: edit::Index, @@ -37281,7 +41057,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::add_memo`]."] + #[doc = "Add an optional memo to an existing crowdloan contribution."] + #[doc = ""] + #[doc = "Origin must be Signed, and the user must have contributed to the crowdloan."] pub struct AddMemo { pub index: add_memo::Index, pub memo: add_memo::Memo, @@ -37305,7 +41083,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::poke`]."] + #[doc = "Poke the fund into `NewRaise`"] + #[doc = ""] + #[doc = "Origin must be Signed, and the fund has non-zero raise."] pub struct Poke { pub index: poke::Index, } @@ -37327,7 +41107,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::contribute_all`]."] + #[doc = "Contribute your entire balance to a crowd sale. This will transfer the entire balance of"] + #[doc = "a user over to fund a parachain slot. It will be withdrawable when the crowdloan has"] + #[doc = "ended and the funds are unused."] pub struct ContributeAll { #[codec(compact)] pub index: contribute_all::Index, @@ -37346,7 +41128,11 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::create`]."] + #[doc = "Create a new crowdloaning campaign for a parachain slot with the given lease period"] + #[doc = "range."] + #[doc = ""] + #[doc = "This applies a lock to your parachain configuration, ensuring that it cannot be changed"] + #[doc = "by the parachain manager."] pub fn create( &self, index: types::create::Index, @@ -37374,7 +41160,8 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::contribute`]."] + #[doc = "Contribute to a crowd sale. This will transfer some balance over to fund a parachain"] + #[doc = "slot. It will be withdrawable when the crowdloan has ended and the funds are unused."] pub fn contribute( &self, index: types::contribute::Index, @@ -37397,7 +41184,23 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::withdraw`]."] + #[doc = "Withdraw full balance of a specific contributor."] + #[doc = ""] + #[doc = "Origin must be signed, but can come from anyone."] + #[doc = ""] + #[doc = "The fund must be either in, or ready for, retirement. For a fund to be *in* retirement,"] + #[doc = "then the retirement flag must be set. For a fund to be ready for retirement, then:"] + #[doc = "- it must not already be in retirement;"] + #[doc = "- the amount of raised funds must be bigger than the _free_ balance of the account;"] + #[doc = "- and either:"] + #[doc = " - the block number must be at least `end`; or"] + #[doc = " - the current lease period must be greater than the fund's `last_period`."] + #[doc = ""] + #[doc = "In this case, the fund's retirement flag is set and its `end` is reset to the current"] + #[doc = "block number."] + #[doc = ""] + #[doc = "- `who`: The account whose contribution should be withdrawn."] + #[doc = "- `index`: The parachain to whose crowdloan the contribution was made."] pub fn withdraw( &self, who: types::withdraw::Who, @@ -37414,7 +41217,11 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::refund`]."] + #[doc = "Automatically refund contributors of an ended crowdloan."] + #[doc = "Due to weight restrictions, this function may need to be called multiple"] + #[doc = "times to fully refund all users. We will refund `RemoveKeysLimit` users at a time."] + #[doc = ""] + #[doc = "Origin must be signed, but can come from anyone."] pub fn refund( &self, index: types::refund::Index, @@ -37431,7 +41238,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::dissolve`]."] + #[doc = "Remove a fund after the retirement period has ended and all funds have been returned."] pub fn dissolve( &self, index: types::dissolve::Index, @@ -37448,7 +41255,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::edit`]."] + #[doc = "Edit the configuration for an in-progress crowdloan."] + #[doc = ""] + #[doc = "Can only be called by Root origin."] pub fn edit( &self, index: types::edit::Index, @@ -37477,7 +41286,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::add_memo`]."] + #[doc = "Add an optional memo to an existing crowdloan contribution."] + #[doc = ""] + #[doc = "Origin must be Signed, and the user must have contributed to the crowdloan."] pub fn add_memo( &self, index: types::add_memo::Index, @@ -37495,7 +41306,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::poke`]."] + #[doc = "Poke the fund into `NewRaise`"] + #[doc = ""] + #[doc = "Origin must be Signed, and the fund has non-zero raise."] pub fn poke(&self, index: types::poke::Index) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Crowdloan", @@ -37509,7 +41322,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::contribute_all`]."] + #[doc = "Contribute your entire balance to a crowd sale. This will transfer the entire balance of"] + #[doc = "a user over to fund a parachain slot. It will be withdrawable when the crowdloan has"] + #[doc = "ended and the funds are unused."] pub fn contribute_all( &self, index: types::contribute_all::Index, @@ -37804,7 +41619,7 @@ pub mod api { pub fn funds_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::funds::Funds, (), (), @@ -37813,7 +41628,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Crowdloan", "Funds", - vec![], + (), [ 191u8, 255u8, 37u8, 49u8, 246u8, 246u8, 168u8, 178u8, 73u8, 238u8, 49u8, 76u8, 66u8, 246u8, 207u8, 12u8, 76u8, 233u8, 31u8, 218u8, 132u8, @@ -37827,7 +41642,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::funds::Funds, ::subxt::storage::address::Yes, (), @@ -37836,9 +41651,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Crowdloan", "Funds", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 191u8, 255u8, 37u8, 49u8, 246u8, 246u8, 168u8, 178u8, 73u8, 238u8, 49u8, 76u8, 66u8, 246u8, 207u8, 12u8, 76u8, 233u8, 31u8, 218u8, 132u8, @@ -37852,7 +41665,7 @@ pub mod api { pub fn new_raise( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::new_raise::NewRaise, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -37861,7 +41674,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Crowdloan", "NewRaise", - vec![], + (), [ 251u8, 31u8, 237u8, 22u8, 90u8, 248u8, 39u8, 66u8, 93u8, 81u8, 209u8, 209u8, 194u8, 42u8, 109u8, 208u8, 56u8, 75u8, 45u8, 247u8, 253u8, @@ -37874,7 +41687,7 @@ pub mod api { pub fn endings_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::endings_count::EndingsCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -37883,7 +41696,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Crowdloan", "EndingsCount", - vec![], + (), [ 106u8, 22u8, 229u8, 157u8, 118u8, 195u8, 11u8, 42u8, 5u8, 50u8, 44u8, 183u8, 72u8, 167u8, 95u8, 243u8, 234u8, 5u8, 200u8, 253u8, 127u8, @@ -37895,7 +41708,7 @@ pub mod api { pub fn next_fund_index( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::next_fund_index::NextFundIndex, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -37904,7 +41717,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Crowdloan", "NextFundIndex", - vec![], + (), [ 192u8, 21u8, 229u8, 234u8, 152u8, 224u8, 149u8, 44u8, 41u8, 9u8, 191u8, 128u8, 118u8, 11u8, 117u8, 245u8, 170u8, 116u8, 77u8, 216u8, 175u8, @@ -37991,7 +41804,6 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::request_core_count`]."] pub struct RequestCoreCount { pub count: request_core_count::Count, } @@ -38013,7 +41825,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::assign_core`]."] + #[doc = "Receive instructions from the `ExternalBrokerOrigin`, detailing how a specific core is"] + #[doc = "to be used."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "-`origin`: The `ExternalBrokerOrigin`, assumed to be the Broker system parachain."] + #[doc = "-`core`: The core that should be scheduled."] + #[doc = "-`begin`: The starting blockheight of the instruction."] + #[doc = "-`assignment`: How the blockspace should be utilised."] + #[doc = "-`end_hint`: An optional hint as to when this particular set of instructions will end."] pub struct AssignCore { pub core: assign_core::Core, pub begin: assign_core::Begin, @@ -38037,7 +41857,6 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::request_core_count`]."] pub fn request_core_count( &self, count: types::request_core_count::Count, @@ -38054,7 +41873,15 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::assign_core`]."] + #[doc = "Receive instructions from the `ExternalBrokerOrigin`, detailing how a specific core is"] + #[doc = "to be used."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "-`origin`: The `ExternalBrokerOrigin`, assumed to be the Broker system parachain."] + #[doc = "-`core`: The core that should be scheduled."] + #[doc = "-`begin`: The starting blockheight of the instruction."] + #[doc = "-`assignment`: How the blockspace should be utilised."] + #[doc = "-`end_hint`: An optional hint as to when this particular set of instructions will end."] pub fn assign_core( &self, core: types::assign_core::Core, @@ -38172,7 +41999,6 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::send`]."] pub struct Send { pub dest: ::std::boxed::Box, pub message: ::std::boxed::Box, @@ -38196,7 +42022,24 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::teleport_assets`]."] + #[doc = "Teleport some assets from the local chain to some destination chain."] + #[doc = ""] + #[doc = "**This function is deprecated: Use `limited_teleport_assets` instead.**"] + #[doc = ""] + #[doc = "Fee payment on the destination side is made from the asset in the `assets` vector of"] + #[doc = "index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited,"] + #[doc = "with all fees taken as needed from the asset."] + #[doc = ""] + #[doc = "- `origin`: Must be capable of withdrawing the `assets` and executing XCM."] + #[doc = "- `dest`: Destination context for the assets. Will typically be `[Parent,"] + #[doc = " Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from"] + #[doc = " relay to parachain."] + #[doc = "- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will"] + #[doc = " generally be an `AccountId32` value."] + #[doc = "- `assets`: The assets to be withdrawn. This should include the assets used to pay the"] + #[doc = " fee on the `dest` chain."] + #[doc = "- `fee_asset_item`: The index into `assets` of the item which should be used to pay"] + #[doc = " fees."] pub struct TeleportAssets { pub dest: ::std::boxed::Box, pub beneficiary: ::std::boxed::Box, @@ -38224,7 +42067,36 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::reserve_transfer_assets`]."] + #[doc = "Transfer some assets from the local chain to the destination chain through their local,"] + #[doc = "destination or remote reserve."] + #[doc = ""] + #[doc = "`assets` must have same reserve location and may not be teleportable to `dest`."] + #[doc = " - `assets` have local reserve: transfer assets to sovereign account of destination"] + #[doc = " chain and forward a notification XCM to `dest` to mint and deposit reserve-based"] + #[doc = " assets to `beneficiary`."] + #[doc = " - `assets` have destination reserve: burn local assets and forward a notification to"] + #[doc = " `dest` chain to withdraw the reserve assets from this chain's sovereign account and"] + #[doc = " deposit them to `beneficiary`."] + #[doc = " - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move"] + #[doc = " reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest`"] + #[doc = " to mint and deposit reserve-based assets to `beneficiary`."] + #[doc = ""] + #[doc = "**This function is deprecated: Use `limited_reserve_transfer_assets` instead.**"] + #[doc = ""] + #[doc = "Fee payment on the destination side is made from the asset in the `assets` vector of"] + #[doc = "index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited,"] + #[doc = "with all fees taken as needed from the asset."] + #[doc = ""] + #[doc = "- `origin`: Must be capable of withdrawing the `assets` and executing XCM."] + #[doc = "- `dest`: Destination context for the assets. Will typically be `[Parent,"] + #[doc = " Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from"] + #[doc = " relay to parachain."] + #[doc = "- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will"] + #[doc = " generally be an `AccountId32` value."] + #[doc = "- `assets`: The assets to be withdrawn. This should include the assets used to pay the"] + #[doc = " fee on the `dest` (and possibly reserve) chains."] + #[doc = "- `fee_asset_item`: The index into `assets` of the item which should be used to pay"] + #[doc = " fees."] pub struct ReserveTransferAssets { pub dest: ::std::boxed::Box, pub beneficiary: ::std::boxed::Box, @@ -38252,7 +42124,14 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::execute`]."] + #[doc = "Execute an XCM message from a local, signed, origin."] + #[doc = ""] + #[doc = "An event is deposited indicating whether `msg` could be executed completely or only"] + #[doc = "partially."] + #[doc = ""] + #[doc = "No more than `max_weight` will be used in its attempted execution. If this is less than"] + #[doc = "the maximum amount of weight that the message could take to be executed, then no"] + #[doc = "execution attempt will be made."] pub struct Execute { pub message: ::std::boxed::Box, pub max_weight: execute::MaxWeight, @@ -38276,7 +42155,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_xcm_version`]."] + #[doc = "Extoll that a particular destination can be communicated with through a particular"] + #[doc = "version of XCM."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `location`: The destination that is being described."] + #[doc = "- `xcm_version`: The latest version of XCM that `location` supports."] pub struct ForceXcmVersion { pub location: ::std::boxed::Box, pub version: force_xcm_version::Version, @@ -38300,7 +42184,11 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_default_xcm_version`]."] + #[doc = "Set a safe XCM version (the version that XCM should be encoded with if the most recent"] + #[doc = "version a destination can accept is unknown)."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `maybe_xcm_version`: The default XCM encoding version, or `None` to disable."] pub struct ForceDefaultXcmVersion { pub maybe_xcm_version: force_default_xcm_version::MaybeXcmVersion, } @@ -38322,7 +42210,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_subscribe_version_notify`]."] + #[doc = "Ask a location to notify us regarding their XCM version and any changes to it."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `location`: The location to which we should subscribe for XCM version notifications."] pub struct ForceSubscribeVersionNotify { pub location: ::std::boxed::Box, } @@ -38344,7 +42235,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_unsubscribe_version_notify`]."] + #[doc = "Require that a particular destination should no longer notify us regarding any XCM"] + #[doc = "version changes."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `location`: The location to which we are currently subscribed for XCM version"] + #[doc = " notifications which we no longer desire."] pub struct ForceUnsubscribeVersionNotify { pub location: ::std::boxed::Box, } @@ -38366,7 +42262,36 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::limited_reserve_transfer_assets`]."] + #[doc = "Transfer some assets from the local chain to the destination chain through their local,"] + #[doc = "destination or remote reserve."] + #[doc = ""] + #[doc = "`assets` must have same reserve location and may not be teleportable to `dest`."] + #[doc = " - `assets` have local reserve: transfer assets to sovereign account of destination"] + #[doc = " chain and forward a notification XCM to `dest` to mint and deposit reserve-based"] + #[doc = " assets to `beneficiary`."] + #[doc = " - `assets` have destination reserve: burn local assets and forward a notification to"] + #[doc = " `dest` chain to withdraw the reserve assets from this chain's sovereign account and"] + #[doc = " deposit them to `beneficiary`."] + #[doc = " - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move"] + #[doc = " reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest`"] + #[doc = " to mint and deposit reserve-based assets to `beneficiary`."] + #[doc = ""] + #[doc = "Fee payment on the destination side is made from the asset in the `assets` vector of"] + #[doc = "index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight"] + #[doc = "is needed than `weight_limit`, then the operation will fail and the assets send may be"] + #[doc = "at risk."] + #[doc = ""] + #[doc = "- `origin`: Must be capable of withdrawing the `assets` and executing XCM."] + #[doc = "- `dest`: Destination context for the assets. Will typically be `[Parent,"] + #[doc = " Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from"] + #[doc = " relay to parachain."] + #[doc = "- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will"] + #[doc = " generally be an `AccountId32` value."] + #[doc = "- `assets`: The assets to be withdrawn. This should include the assets used to pay the"] + #[doc = " fee on the `dest` (and possibly reserve) chains."] + #[doc = "- `fee_asset_item`: The index into `assets` of the item which should be used to pay"] + #[doc = " fees."] + #[doc = "- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase."] pub struct LimitedReserveTransferAssets { pub dest: ::std::boxed::Box, pub beneficiary: @@ -38397,7 +42322,24 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::limited_teleport_assets`]."] + #[doc = "Teleport some assets from the local chain to some destination chain."] + #[doc = ""] + #[doc = "Fee payment on the destination side is made from the asset in the `assets` vector of"] + #[doc = "index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight"] + #[doc = "is needed than `weight_limit`, then the operation will fail and the assets send may be"] + #[doc = "at risk."] + #[doc = ""] + #[doc = "- `origin`: Must be capable of withdrawing the `assets` and executing XCM."] + #[doc = "- `dest`: Destination context for the assets. Will typically be `[Parent,"] + #[doc = " Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from"] + #[doc = " relay to parachain."] + #[doc = "- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will"] + #[doc = " generally be an `AccountId32` value."] + #[doc = "- `assets`: The assets to be withdrawn. This should include the assets used to pay the"] + #[doc = " fee on the `dest` chain."] + #[doc = "- `fee_asset_item`: The index into `assets` of the item which should be used to pay"] + #[doc = " fees."] + #[doc = "- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase."] pub struct LimitedTeleportAssets { pub dest: ::std::boxed::Box, pub beneficiary: ::std::boxed::Box, @@ -38427,7 +42369,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_suspension`]."] + #[doc = "Set or unset the global suspension state of the XCM executor."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `suspended`: `true` to suspend, `false` to resume."] pub struct ForceSuspension { pub suspended: force_suspension::Suspended, } @@ -38449,7 +42394,39 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::transfer_assets`]."] + #[doc = "Transfer some assets from the local chain to the destination chain through their local,"] + #[doc = "destination or remote reserve, or through teleports."] + #[doc = ""] + #[doc = "Fee payment on the destination side is made from the asset in the `assets` vector of"] + #[doc = "index `fee_asset_item` (hence referred to as `fees`), up to enough to pay for"] + #[doc = "`weight_limit` of weight. If more weight is needed than `weight_limit`, then the"] + #[doc = "operation will fail and the assets sent may be at risk."] + #[doc = ""] + #[doc = "`assets` (excluding `fees`) must have same reserve location or otherwise be teleportable"] + #[doc = "to `dest`, no limitations imposed on `fees`."] + #[doc = " - for local reserve: transfer assets to sovereign account of destination chain and"] + #[doc = " forward a notification XCM to `dest` to mint and deposit reserve-based assets to"] + #[doc = " `beneficiary`."] + #[doc = " - for destination reserve: burn local assets and forward a notification to `dest` chain"] + #[doc = " to withdraw the reserve assets from this chain's sovereign account and deposit them"] + #[doc = " to `beneficiary`."] + #[doc = " - for remote reserve: burn local assets, forward XCM to reserve chain to move reserves"] + #[doc = " from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` to mint"] + #[doc = " and deposit reserve-based assets to `beneficiary`."] + #[doc = " - for teleports: burn local assets and forward XCM to `dest` chain to mint/teleport"] + #[doc = " assets and deposit them to `beneficiary`."] + #[doc = ""] + #[doc = "- `origin`: Must be capable of withdrawing the `assets` and executing XCM."] + #[doc = "- `dest`: Destination context for the assets. Will typically be `X2(Parent,"] + #[doc = " Parachain(..))` to send from parachain to parachain, or `X1(Parachain(..))` to send"] + #[doc = " from relay to parachain."] + #[doc = "- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will"] + #[doc = " generally be an `AccountId32` value."] + #[doc = "- `assets`: The assets to be withdrawn. This should include the assets used to pay the"] + #[doc = " fee on the `dest` (and possibly reserve) chains."] + #[doc = "- `fee_asset_item`: The index into `assets` of the item which should be used to pay"] + #[doc = " fees."] + #[doc = "- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase."] pub struct TransferAssets { pub dest: ::std::boxed::Box, pub beneficiary: ::std::boxed::Box, @@ -38469,10 +42446,38 @@ pub mod api { const PALLET: &'static str = "XcmPallet"; const CALL: &'static str = "transfer_assets"; } + #[derive( + :: subxt :: ext :: codec :: Decode, + :: subxt :: ext :: codec :: Encode, + :: subxt :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + # [codec (crate = :: subxt :: ext :: codec)] + #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] + #[doc = "Claims assets trapped on this pallet because of leftover assets during XCM execution."] + #[doc = ""] + #[doc = "- `origin`: Anyone can call this extrinsic."] + #[doc = "- `assets`: The exact assets that were trapped. Use the version to specify what version"] + #[doc = "was the latest when they were trapped."] + #[doc = "- `beneficiary`: The location/account where the claimed assets will be deposited."] + pub struct ClaimAssets { + pub assets: ::std::boxed::Box, + pub beneficiary: ::std::boxed::Box, + } + pub mod claim_assets { + use super::runtime_types; + pub type Assets = runtime_types::xcm::VersionedAssets; + pub type Beneficiary = runtime_types::xcm::VersionedLocation; + } + impl ::subxt::blocks::StaticExtrinsic for ClaimAssets { + const PALLET: &'static str = "XcmPallet"; + const CALL: &'static str = "claim_assets"; + } } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::send`]."] pub fn send( &self, dest: types::send::Dest, @@ -38493,7 +42498,24 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::teleport_assets`]."] + #[doc = "Teleport some assets from the local chain to some destination chain."] + #[doc = ""] + #[doc = "**This function is deprecated: Use `limited_teleport_assets` instead.**"] + #[doc = ""] + #[doc = "Fee payment on the destination side is made from the asset in the `assets` vector of"] + #[doc = "index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited,"] + #[doc = "with all fees taken as needed from the asset."] + #[doc = ""] + #[doc = "- `origin`: Must be capable of withdrawing the `assets` and executing XCM."] + #[doc = "- `dest`: Destination context for the assets. Will typically be `[Parent,"] + #[doc = " Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from"] + #[doc = " relay to parachain."] + #[doc = "- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will"] + #[doc = " generally be an `AccountId32` value."] + #[doc = "- `assets`: The assets to be withdrawn. This should include the assets used to pay the"] + #[doc = " fee on the `dest` chain."] + #[doc = "- `fee_asset_item`: The index into `assets` of the item which should be used to pay"] + #[doc = " fees."] pub fn teleport_assets( &self, dest: types::teleport_assets::Dest, @@ -38517,7 +42539,36 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::reserve_transfer_assets`]."] + #[doc = "Transfer some assets from the local chain to the destination chain through their local,"] + #[doc = "destination or remote reserve."] + #[doc = ""] + #[doc = "`assets` must have same reserve location and may not be teleportable to `dest`."] + #[doc = " - `assets` have local reserve: transfer assets to sovereign account of destination"] + #[doc = " chain and forward a notification XCM to `dest` to mint and deposit reserve-based"] + #[doc = " assets to `beneficiary`."] + #[doc = " - `assets` have destination reserve: burn local assets and forward a notification to"] + #[doc = " `dest` chain to withdraw the reserve assets from this chain's sovereign account and"] + #[doc = " deposit them to `beneficiary`."] + #[doc = " - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move"] + #[doc = " reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest`"] + #[doc = " to mint and deposit reserve-based assets to `beneficiary`."] + #[doc = ""] + #[doc = "**This function is deprecated: Use `limited_reserve_transfer_assets` instead.**"] + #[doc = ""] + #[doc = "Fee payment on the destination side is made from the asset in the `assets` vector of"] + #[doc = "index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited,"] + #[doc = "with all fees taken as needed from the asset."] + #[doc = ""] + #[doc = "- `origin`: Must be capable of withdrawing the `assets` and executing XCM."] + #[doc = "- `dest`: Destination context for the assets. Will typically be `[Parent,"] + #[doc = " Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from"] + #[doc = " relay to parachain."] + #[doc = "- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will"] + #[doc = " generally be an `AccountId32` value."] + #[doc = "- `assets`: The assets to be withdrawn. This should include the assets used to pay the"] + #[doc = " fee on the `dest` (and possibly reserve) chains."] + #[doc = "- `fee_asset_item`: The index into `assets` of the item which should be used to pay"] + #[doc = " fees."] pub fn reserve_transfer_assets( &self, dest: types::reserve_transfer_assets::Dest, @@ -38542,7 +42593,14 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::execute`]."] + #[doc = "Execute an XCM message from a local, signed, origin."] + #[doc = ""] + #[doc = "An event is deposited indicating whether `msg` could be executed completely or only"] + #[doc = "partially."] + #[doc = ""] + #[doc = "No more than `max_weight` will be used in its attempted execution. If this is less than"] + #[doc = "the maximum amount of weight that the message could take to be executed, then no"] + #[doc = "execution attempt will be made."] pub fn execute( &self, message: types::execute::Message, @@ -38563,7 +42621,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_xcm_version`]."] + #[doc = "Extoll that a particular destination can be communicated with through a particular"] + #[doc = "version of XCM."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `location`: The destination that is being described."] + #[doc = "- `xcm_version`: The latest version of XCM that `location` supports."] pub fn force_xcm_version( &self, location: types::force_xcm_version::Location, @@ -38583,7 +42646,11 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_default_xcm_version`]."] + #[doc = "Set a safe XCM version (the version that XCM should be encoded with if the most recent"] + #[doc = "version a destination can accept is unknown)."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `maybe_xcm_version`: The default XCM encoding version, or `None` to disable."] pub fn force_default_xcm_version( &self, maybe_xcm_version: types::force_default_xcm_version::MaybeXcmVersion, @@ -38600,7 +42667,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_subscribe_version_notify`]."] + #[doc = "Ask a location to notify us regarding their XCM version and any changes to it."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `location`: The location to which we should subscribe for XCM version notifications."] pub fn force_subscribe_version_notify( &self, location: types::force_subscribe_version_notify::Location, @@ -38618,7 +42688,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_unsubscribe_version_notify`]."] + #[doc = "Require that a particular destination should no longer notify us regarding any XCM"] + #[doc = "version changes."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `location`: The location to which we are currently subscribed for XCM version"] + #[doc = " notifications which we no longer desire."] pub fn force_unsubscribe_version_notify( &self, location: types::force_unsubscribe_version_notify::Location, @@ -38636,7 +42711,36 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::limited_reserve_transfer_assets`]."] + #[doc = "Transfer some assets from the local chain to the destination chain through their local,"] + #[doc = "destination or remote reserve."] + #[doc = ""] + #[doc = "`assets` must have same reserve location and may not be teleportable to `dest`."] + #[doc = " - `assets` have local reserve: transfer assets to sovereign account of destination"] + #[doc = " chain and forward a notification XCM to `dest` to mint and deposit reserve-based"] + #[doc = " assets to `beneficiary`."] + #[doc = " - `assets` have destination reserve: burn local assets and forward a notification to"] + #[doc = " `dest` chain to withdraw the reserve assets from this chain's sovereign account and"] + #[doc = " deposit them to `beneficiary`."] + #[doc = " - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move"] + #[doc = " reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest`"] + #[doc = " to mint and deposit reserve-based assets to `beneficiary`."] + #[doc = ""] + #[doc = "Fee payment on the destination side is made from the asset in the `assets` vector of"] + #[doc = "index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight"] + #[doc = "is needed than `weight_limit`, then the operation will fail and the assets send may be"] + #[doc = "at risk."] + #[doc = ""] + #[doc = "- `origin`: Must be capable of withdrawing the `assets` and executing XCM."] + #[doc = "- `dest`: Destination context for the assets. Will typically be `[Parent,"] + #[doc = " Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from"] + #[doc = " relay to parachain."] + #[doc = "- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will"] + #[doc = " generally be an `AccountId32` value."] + #[doc = "- `assets`: The assets to be withdrawn. This should include the assets used to pay the"] + #[doc = " fee on the `dest` (and possibly reserve) chains."] + #[doc = "- `fee_asset_item`: The index into `assets` of the item which should be used to pay"] + #[doc = " fees."] + #[doc = "- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase."] pub fn limited_reserve_transfer_assets( &self, dest: types::limited_reserve_transfer_assets::Dest, @@ -38663,7 +42767,24 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::limited_teleport_assets`]."] + #[doc = "Teleport some assets from the local chain to some destination chain."] + #[doc = ""] + #[doc = "Fee payment on the destination side is made from the asset in the `assets` vector of"] + #[doc = "index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight"] + #[doc = "is needed than `weight_limit`, then the operation will fail and the assets send may be"] + #[doc = "at risk."] + #[doc = ""] + #[doc = "- `origin`: Must be capable of withdrawing the `assets` and executing XCM."] + #[doc = "- `dest`: Destination context for the assets. Will typically be `[Parent,"] + #[doc = " Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from"] + #[doc = " relay to parachain."] + #[doc = "- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will"] + #[doc = " generally be an `AccountId32` value."] + #[doc = "- `assets`: The assets to be withdrawn. This should include the assets used to pay the"] + #[doc = " fee on the `dest` chain."] + #[doc = "- `fee_asset_item`: The index into `assets` of the item which should be used to pay"] + #[doc = " fees."] + #[doc = "- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase."] pub fn limited_teleport_assets( &self, dest: types::limited_teleport_assets::Dest, @@ -38689,7 +42810,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_suspension`]."] + #[doc = "Set or unset the global suspension state of the XCM executor."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `suspended`: `true` to suspend, `false` to resume."] pub fn force_suspension( &self, suspended: types::force_suspension::Suspended, @@ -38705,7 +42829,39 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::transfer_assets`]."] + #[doc = "Transfer some assets from the local chain to the destination chain through their local,"] + #[doc = "destination or remote reserve, or through teleports."] + #[doc = ""] + #[doc = "Fee payment on the destination side is made from the asset in the `assets` vector of"] + #[doc = "index `fee_asset_item` (hence referred to as `fees`), up to enough to pay for"] + #[doc = "`weight_limit` of weight. If more weight is needed than `weight_limit`, then the"] + #[doc = "operation will fail and the assets sent may be at risk."] + #[doc = ""] + #[doc = "`assets` (excluding `fees`) must have same reserve location or otherwise be teleportable"] + #[doc = "to `dest`, no limitations imposed on `fees`."] + #[doc = " - for local reserve: transfer assets to sovereign account of destination chain and"] + #[doc = " forward a notification XCM to `dest` to mint and deposit reserve-based assets to"] + #[doc = " `beneficiary`."] + #[doc = " - for destination reserve: burn local assets and forward a notification to `dest` chain"] + #[doc = " to withdraw the reserve assets from this chain's sovereign account and deposit them"] + #[doc = " to `beneficiary`."] + #[doc = " - for remote reserve: burn local assets, forward XCM to reserve chain to move reserves"] + #[doc = " from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` to mint"] + #[doc = " and deposit reserve-based assets to `beneficiary`."] + #[doc = " - for teleports: burn local assets and forward XCM to `dest` chain to mint/teleport"] + #[doc = " assets and deposit them to `beneficiary`."] + #[doc = ""] + #[doc = "- `origin`: Must be capable of withdrawing the `assets` and executing XCM."] + #[doc = "- `dest`: Destination context for the assets. Will typically be `X2(Parent,"] + #[doc = " Parachain(..))` to send from parachain to parachain, or `X1(Parachain(..))` to send"] + #[doc = " from relay to parachain."] + #[doc = "- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will"] + #[doc = " generally be an `AccountId32` value."] + #[doc = "- `assets`: The assets to be withdrawn. This should include the assets used to pay the"] + #[doc = " fee on the `dest` (and possibly reserve) chains."] + #[doc = "- `fee_asset_item`: The index into `assets` of the item which should be used to pay"] + #[doc = " fees."] + #[doc = "- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase."] pub fn transfer_assets( &self, dest: types::transfer_assets::Dest, @@ -38732,6 +42888,32 @@ pub mod api { ], ) } + #[doc = "Claims assets trapped on this pallet because of leftover assets during XCM execution."] + #[doc = ""] + #[doc = "- `origin`: Anyone can call this extrinsic."] + #[doc = "- `assets`: The exact assets that were trapped. Use the version to specify what version"] + #[doc = "was the latest when they were trapped."] + #[doc = "- `beneficiary`: The location/account where the claimed assets will be deposited."] + pub fn claim_assets( + &self, + assets: types::claim_assets::Assets, + beneficiary: types::claim_assets::Beneficiary, + ) -> ::subxt::tx::Payload { + ::subxt::tx::Payload::new_static( + "XcmPallet", + "claim_assets", + types::ClaimAssets { + assets: ::std::boxed::Box::new(assets), + beneficiary: ::std::boxed::Box::new(beneficiary), + }, + [ + 155u8, 23u8, 166u8, 172u8, 251u8, 171u8, 136u8, 240u8, 253u8, 51u8, + 164u8, 43u8, 141u8, 23u8, 189u8, 177u8, 33u8, 32u8, 212u8, 56u8, 174u8, + 165u8, 129u8, 7u8, 49u8, 217u8, 213u8, 214u8, 250u8, 91u8, 200u8, + 195u8, + ], + ) + } } } #[doc = "The `Event` enum of this pallet"] @@ -39467,7 +43649,7 @@ pub mod api { pub fn query_counter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::query_counter::QueryCounter, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -39476,7 +43658,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "QueryCounter", - vec![], + (), [ 216u8, 73u8, 160u8, 232u8, 60u8, 245u8, 218u8, 219u8, 152u8, 68u8, 146u8, 219u8, 255u8, 7u8, 86u8, 112u8, 83u8, 49u8, 94u8, 173u8, 64u8, @@ -39489,7 +43671,7 @@ pub mod api { pub fn queries_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::queries::Queries, (), (), @@ -39498,7 +43680,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "Queries", - vec![], + (), [ 246u8, 75u8, 240u8, 129u8, 106u8, 114u8, 99u8, 154u8, 176u8, 188u8, 146u8, 125u8, 244u8, 103u8, 187u8, 171u8, 60u8, 119u8, 4u8, 90u8, 58u8, @@ -39512,7 +43694,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::queries::Queries, ::subxt::storage::address::Yes, (), @@ -39521,9 +43703,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "Queries", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 246u8, 75u8, 240u8, 129u8, 106u8, 114u8, 99u8, 154u8, 176u8, 188u8, 146u8, 125u8, 244u8, 103u8, 187u8, 171u8, 60u8, 119u8, 4u8, 90u8, 58u8, @@ -39539,7 +43719,7 @@ pub mod api { pub fn asset_traps_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::asset_traps::AssetTraps, (), ::subxt::storage::address::Yes, @@ -39548,7 +43728,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "AssetTraps", - vec![], + (), [ 148u8, 41u8, 254u8, 134u8, 61u8, 172u8, 126u8, 146u8, 78u8, 178u8, 50u8, 77u8, 226u8, 8u8, 200u8, 78u8, 77u8, 91u8, 26u8, 133u8, 104u8, @@ -39564,7 +43744,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::asset_traps::AssetTraps, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -39573,9 +43753,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "AssetTraps", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 148u8, 41u8, 254u8, 134u8, 61u8, 172u8, 126u8, 146u8, 78u8, 178u8, 50u8, 77u8, 226u8, 8u8, 200u8, 78u8, 77u8, 91u8, 26u8, 133u8, 104u8, @@ -39588,7 +43766,7 @@ pub mod api { pub fn safe_xcm_version( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::safe_xcm_version::SafeXcmVersion, ::subxt::storage::address::Yes, (), @@ -39597,7 +43775,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "SafeXcmVersion", - vec![], + (), [ 187u8, 8u8, 74u8, 126u8, 80u8, 215u8, 177u8, 60u8, 223u8, 123u8, 196u8, 155u8, 166u8, 66u8, 25u8, 164u8, 191u8, 66u8, 116u8, 131u8, 116u8, @@ -39610,7 +43788,7 @@ pub mod api { pub fn supported_version_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::supported_version::SupportedVersion, (), (), @@ -39619,7 +43797,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "SupportedVersion", - vec![], + (), [ 144u8, 218u8, 177u8, 254u8, 210u8, 8u8, 84u8, 149u8, 163u8, 162u8, 238u8, 37u8, 157u8, 28u8, 140u8, 121u8, 201u8, 173u8, 204u8, 92u8, @@ -39633,7 +43811,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::supported_version::SupportedVersion, (), (), @@ -39642,9 +43820,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "SupportedVersion", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 144u8, 218u8, 177u8, 254u8, 210u8, 8u8, 84u8, 149u8, 163u8, 162u8, 238u8, 37u8, 157u8, 28u8, 140u8, 121u8, 201u8, 173u8, 204u8, 92u8, @@ -39659,7 +43835,14 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey< + types::supported_version::Param0, + >, + ::subxt::storage::address::StaticStorageKey< + types::supported_version::Param1, + >, + ), types::supported_version::SupportedVersion, ::subxt::storage::address::Yes, (), @@ -39668,10 +43851,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "SupportedVersion", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 144u8, 218u8, 177u8, 254u8, 210u8, 8u8, 84u8, 149u8, 163u8, 162u8, 238u8, 37u8, 157u8, 28u8, 140u8, 121u8, 201u8, 173u8, 204u8, 92u8, @@ -39684,7 +43867,7 @@ pub mod api { pub fn version_notifiers_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::version_notifiers::VersionNotifiers, (), (), @@ -39693,7 +43876,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "VersionNotifiers", - vec![], + (), [ 175u8, 206u8, 29u8, 14u8, 111u8, 123u8, 211u8, 109u8, 159u8, 131u8, 80u8, 149u8, 216u8, 196u8, 181u8, 105u8, 117u8, 138u8, 80u8, 69u8, @@ -39707,7 +43890,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::version_notifiers::VersionNotifiers, (), (), @@ -39716,9 +43899,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "VersionNotifiers", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 175u8, 206u8, 29u8, 14u8, 111u8, 123u8, 211u8, 109u8, 159u8, 131u8, 80u8, 149u8, 216u8, 196u8, 181u8, 105u8, 117u8, 138u8, 80u8, 69u8, @@ -39733,7 +43914,14 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey< + types::version_notifiers::Param0, + >, + ::subxt::storage::address::StaticStorageKey< + types::version_notifiers::Param1, + >, + ), types::version_notifiers::VersionNotifiers, ::subxt::storage::address::Yes, (), @@ -39742,10 +43930,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "VersionNotifiers", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 175u8, 206u8, 29u8, 14u8, 111u8, 123u8, 211u8, 109u8, 159u8, 131u8, 80u8, 149u8, 216u8, 196u8, 181u8, 105u8, 117u8, 138u8, 80u8, 69u8, @@ -39759,7 +43947,7 @@ pub mod api { pub fn version_notify_targets_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::version_notify_targets::VersionNotifyTargets, (), (), @@ -39768,7 +43956,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "VersionNotifyTargets", - vec![], + (), [ 113u8, 77u8, 150u8, 42u8, 82u8, 49u8, 195u8, 120u8, 96u8, 80u8, 152u8, 67u8, 27u8, 142u8, 10u8, 74u8, 66u8, 134u8, 35u8, 202u8, 77u8, 187u8, @@ -39782,7 +43970,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::version_notify_targets::Param0, + >, types::version_notify_targets::VersionNotifyTargets, (), (), @@ -39791,9 +43981,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "VersionNotifyTargets", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 113u8, 77u8, 150u8, 42u8, 82u8, 49u8, 195u8, 120u8, 96u8, 80u8, 152u8, 67u8, 27u8, 142u8, 10u8, 74u8, 66u8, 134u8, 35u8, 202u8, 77u8, 187u8, @@ -39808,7 +43996,14 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey< + types::version_notify_targets::Param0, + >, + ::subxt::storage::address::StaticStorageKey< + types::version_notify_targets::Param1, + >, + ), types::version_notify_targets::VersionNotifyTargets, ::subxt::storage::address::Yes, (), @@ -39817,10 +44012,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "VersionNotifyTargets", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 113u8, 77u8, 150u8, 42u8, 82u8, 49u8, 195u8, 120u8, 96u8, 80u8, 152u8, 67u8, 27u8, 142u8, 10u8, 74u8, 66u8, 134u8, 35u8, 202u8, 77u8, 187u8, @@ -39834,7 +44029,7 @@ pub mod api { pub fn version_discovery_queue( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::version_discovery_queue::VersionDiscoveryQueue, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -39843,7 +44038,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "VersionDiscoveryQueue", - vec![], + (), [ 95u8, 74u8, 97u8, 94u8, 40u8, 140u8, 175u8, 176u8, 224u8, 222u8, 83u8, 199u8, 170u8, 102u8, 3u8, 77u8, 127u8, 208u8, 155u8, 122u8, 176u8, @@ -39856,7 +44051,7 @@ pub mod api { pub fn current_migration( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::current_migration::CurrentMigration, ::subxt::storage::address::Yes, (), @@ -39865,7 +44060,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "CurrentMigration", - vec![], + (), [ 74u8, 138u8, 181u8, 162u8, 59u8, 251u8, 37u8, 28u8, 232u8, 51u8, 30u8, 152u8, 252u8, 133u8, 95u8, 195u8, 47u8, 127u8, 21u8, 44u8, 62u8, 143u8, @@ -39877,7 +44072,7 @@ pub mod api { pub fn remote_locked_fungibles_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::remote_locked_fungibles::RemoteLockedFungibles, (), (), @@ -39886,7 +44081,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "RemoteLockedFungibles", - vec![], + (), [ 247u8, 124u8, 77u8, 42u8, 208u8, 183u8, 99u8, 196u8, 50u8, 113u8, 250u8, 221u8, 222u8, 170u8, 10u8, 60u8, 143u8, 172u8, 149u8, 198u8, @@ -39900,7 +44095,9 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey< + types::remote_locked_fungibles::Param0, + >, types::remote_locked_fungibles::RemoteLockedFungibles, (), (), @@ -39909,9 +44106,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "RemoteLockedFungibles", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 247u8, 124u8, 77u8, 42u8, 208u8, 183u8, 99u8, 196u8, 50u8, 113u8, 250u8, 221u8, 222u8, 170u8, 10u8, 60u8, 143u8, 172u8, 149u8, 198u8, @@ -39926,7 +44121,14 @@ pub mod api { _0: impl ::std::borrow::Borrow, _1: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey< + types::remote_locked_fungibles::Param0, + >, + ::subxt::storage::address::StaticStorageKey< + types::remote_locked_fungibles::Param1, + >, + ), types::remote_locked_fungibles::RemoteLockedFungibles, (), (), @@ -39935,10 +44137,10 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "RemoteLockedFungibles", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ), [ 247u8, 124u8, 77u8, 42u8, 208u8, 183u8, 99u8, 196u8, 50u8, 113u8, 250u8, 221u8, 222u8, 170u8, 10u8, 60u8, 143u8, 172u8, 149u8, 198u8, @@ -39954,7 +44156,17 @@ pub mod api { _1: impl ::std::borrow::Borrow, _2: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ( + ::subxt::storage::address::StaticStorageKey< + types::remote_locked_fungibles::Param0, + >, + ::subxt::storage::address::StaticStorageKey< + types::remote_locked_fungibles::Param1, + >, + ::subxt::storage::address::StaticStorageKey< + types::remote_locked_fungibles::Param2, + >, + ), types::remote_locked_fungibles::RemoteLockedFungibles, ::subxt::storage::address::Yes, (), @@ -39963,11 +44175,11 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "RemoteLockedFungibles", - vec![ - ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), - ::subxt::storage::address::make_static_storage_map_key(_2.borrow()), - ], + ( + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_1.borrow()), + ::subxt::storage::address::StaticStorageKey::new(_2.borrow()), + ), [ 247u8, 124u8, 77u8, 42u8, 208u8, 183u8, 99u8, 196u8, 50u8, 113u8, 250u8, 221u8, 222u8, 170u8, 10u8, 60u8, 143u8, 172u8, 149u8, 198u8, @@ -39980,7 +44192,7 @@ pub mod api { pub fn locked_fungibles_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::locked_fungibles::LockedFungibles, (), (), @@ -39989,7 +44201,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "LockedFungibles", - vec![], + (), [ 254u8, 234u8, 1u8, 27u8, 27u8, 32u8, 217u8, 24u8, 47u8, 30u8, 62u8, 80u8, 86u8, 125u8, 120u8, 24u8, 143u8, 229u8, 161u8, 153u8, 240u8, @@ -40002,7 +44214,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::locked_fungibles::LockedFungibles, ::subxt::storage::address::Yes, (), @@ -40011,9 +44223,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "LockedFungibles", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 254u8, 234u8, 1u8, 27u8, 27u8, 32u8, 217u8, 24u8, 47u8, 30u8, 62u8, 80u8, 86u8, 125u8, 120u8, 24u8, 143u8, 229u8, 161u8, 153u8, 240u8, @@ -40025,7 +44235,7 @@ pub mod api { pub fn xcm_execution_suspended( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::xcm_execution_suspended::XcmExecutionSuspended, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -40034,7 +44244,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "XcmPallet", "XcmExecutionSuspended", - vec![], + (), [ 182u8, 54u8, 69u8, 68u8, 78u8, 76u8, 103u8, 79u8, 47u8, 136u8, 99u8, 104u8, 128u8, 129u8, 249u8, 54u8, 214u8, 136u8, 97u8, 48u8, 178u8, @@ -40068,7 +44278,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::report_equivocation`]."] + #[doc = "Report voter equivocation/misbehavior. This method will verify the"] + #[doc = "equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence"] + #[doc = "will be reported."] pub struct ReportEquivocation { pub equivocation_proof: ::std::boxed::Box, @@ -40098,7 +44311,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::report_equivocation_unsigned`]."] + #[doc = "Report voter equivocation/misbehavior. This method will verify the"] + #[doc = "equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence"] + #[doc = "will be reported."] + #[doc = ""] + #[doc = "This extrinsic must be called unsigned and it is expected that only"] + #[doc = "block authors will call it (validated in `ValidateUnsigned`), as such"] + #[doc = "if the block author is defined it will be defined as the equivocation"] + #[doc = "reporter."] pub struct ReportEquivocationUnsigned { pub equivocation_proof: ::std::boxed::Box, @@ -40128,7 +44349,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_new_genesis`]."] + #[doc = "Reset BEEFY consensus by setting a new BEEFY genesis at `delay_in_blocks` blocks in the"] + #[doc = "future."] + #[doc = ""] + #[doc = "Note: `delay_in_blocks` has to be at least 1."] pub struct SetNewGenesis { pub delay_in_blocks: set_new_genesis::DelayInBlocks, } @@ -40143,7 +44367,10 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::report_equivocation`]."] + #[doc = "Report voter equivocation/misbehavior. This method will verify the"] + #[doc = "equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence"] + #[doc = "will be reported."] pub fn report_equivocation( &self, equivocation_proof: types::report_equivocation::EquivocationProof, @@ -40164,7 +44391,15 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::report_equivocation_unsigned`]."] + #[doc = "Report voter equivocation/misbehavior. This method will verify the"] + #[doc = "equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence"] + #[doc = "will be reported."] + #[doc = ""] + #[doc = "This extrinsic must be called unsigned and it is expected that only"] + #[doc = "block authors will call it (validated in `ValidateUnsigned`), as such"] + #[doc = "if the block author is defined it will be defined as the equivocation"] + #[doc = "reporter."] pub fn report_equivocation_unsigned( &self, equivocation_proof: types::report_equivocation_unsigned::EquivocationProof, @@ -40185,7 +44420,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_new_genesis`]."] + #[doc = "Reset BEEFY consensus by setting a new BEEFY genesis at `delay_in_blocks` blocks in the"] + #[doc = "future."] + #[doc = ""] + #[doc = "Note: `delay_in_blocks` has to be at least 1."] pub fn set_new_genesis( &self, delay_in_blocks: types::set_new_genesis::DelayInBlocks, @@ -40241,7 +44479,7 @@ pub mod api { pub fn authorities( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::authorities::Authorities, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -40250,7 +44488,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Beefy", "Authorities", - vec![], + (), [ 53u8, 171u8, 94u8, 33u8, 46u8, 83u8, 105u8, 120u8, 123u8, 201u8, 141u8, 71u8, 131u8, 150u8, 51u8, 121u8, 67u8, 45u8, 249u8, 146u8, 85u8, 113u8, @@ -40262,7 +44500,7 @@ pub mod api { pub fn validator_set_id( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::validator_set_id::ValidatorSetId, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -40271,7 +44509,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Beefy", "ValidatorSetId", - vec![], + (), [ 168u8, 84u8, 23u8, 134u8, 153u8, 30u8, 183u8, 176u8, 206u8, 100u8, 109u8, 86u8, 109u8, 126u8, 146u8, 175u8, 173u8, 1u8, 253u8, 42u8, @@ -40284,7 +44522,7 @@ pub mod api { pub fn next_authorities( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::next_authorities::NextAuthorities, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -40293,7 +44531,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Beefy", "NextAuthorities", - vec![], + (), [ 87u8, 180u8, 0u8, 85u8, 209u8, 13u8, 131u8, 103u8, 8u8, 226u8, 42u8, 72u8, 38u8, 47u8, 190u8, 78u8, 62u8, 4u8, 161u8, 130u8, 87u8, 196u8, @@ -40314,7 +44552,7 @@ pub mod api { pub fn set_id_session_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::set_id_session::SetIdSession, (), (), @@ -40323,7 +44561,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Beefy", "SetIdSession", - vec![], + (), [ 47u8, 0u8, 239u8, 121u8, 187u8, 213u8, 254u8, 50u8, 238u8, 10u8, 162u8, 65u8, 189u8, 166u8, 37u8, 74u8, 82u8, 81u8, 160u8, 20u8, 180u8, 253u8, @@ -40345,7 +44583,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::set_id_session::SetIdSession, ::subxt::storage::address::Yes, (), @@ -40354,9 +44592,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Beefy", "SetIdSession", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 47u8, 0u8, 239u8, 121u8, 187u8, 213u8, 254u8, 50u8, 238u8, 10u8, 162u8, 65u8, 189u8, 166u8, 37u8, 74u8, 82u8, 81u8, 160u8, 20u8, 180u8, 253u8, @@ -40370,7 +44606,7 @@ pub mod api { pub fn genesis_block( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::genesis_block::GenesisBlock, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -40379,7 +44615,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Beefy", "GenesisBlock", - vec![], + (), [ 198u8, 155u8, 11u8, 240u8, 189u8, 245u8, 159u8, 127u8, 55u8, 33u8, 48u8, 29u8, 209u8, 119u8, 163u8, 24u8, 28u8, 22u8, 163u8, 163u8, 124u8, @@ -40473,7 +44709,7 @@ pub mod api { pub fn root_hash( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::root_hash::RootHash, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -40482,7 +44718,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Mmr", "RootHash", - vec![], + (), [ 111u8, 206u8, 173u8, 92u8, 67u8, 49u8, 150u8, 113u8, 90u8, 245u8, 38u8, 254u8, 76u8, 250u8, 167u8, 66u8, 130u8, 129u8, 251u8, 220u8, 172u8, @@ -40494,7 +44730,7 @@ pub mod api { pub fn number_of_leaves( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::number_of_leaves::NumberOfLeaves, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -40503,7 +44739,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Mmr", "NumberOfLeaves", - vec![], + (), [ 123u8, 58u8, 149u8, 174u8, 85u8, 45u8, 20u8, 115u8, 241u8, 0u8, 51u8, 174u8, 234u8, 60u8, 230u8, 59u8, 237u8, 144u8, 170u8, 32u8, 4u8, 0u8, @@ -40518,7 +44754,7 @@ pub mod api { pub fn nodes_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::nodes::Nodes, (), (), @@ -40527,7 +44763,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Mmr", "Nodes", - vec![], + (), [ 27u8, 84u8, 41u8, 195u8, 146u8, 81u8, 211u8, 189u8, 63u8, 125u8, 173u8, 206u8, 69u8, 198u8, 202u8, 213u8, 89u8, 31u8, 89u8, 177u8, 76u8, 154u8, @@ -40543,7 +44779,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::nodes::Nodes, ::subxt::storage::address::Yes, (), @@ -40552,9 +44788,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Mmr", "Nodes", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 27u8, 84u8, 41u8, 195u8, 146u8, 81u8, 211u8, 189u8, 63u8, 125u8, 173u8, 206u8, 69u8, 198u8, 202u8, 213u8, 89u8, 31u8, 89u8, 177u8, 76u8, 154u8, @@ -40593,7 +44827,7 @@ pub mod api { pub fn beefy_authorities( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::beefy_authorities::BeefyAuthorities, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -40602,7 +44836,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "MmrLeaf", "BeefyAuthorities", - vec![], + (), [ 128u8, 35u8, 176u8, 79u8, 224u8, 58u8, 214u8, 234u8, 231u8, 71u8, 227u8, 153u8, 180u8, 189u8, 66u8, 44u8, 47u8, 174u8, 0u8, 83u8, 121u8, @@ -40617,7 +44851,7 @@ pub mod api { pub fn beefy_next_authorities( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::beefy_next_authorities::BeefyNextAuthorities, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -40626,7 +44860,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "MmrLeaf", "BeefyNextAuthorities", - vec![], + (), [ 97u8, 71u8, 52u8, 111u8, 120u8, 251u8, 183u8, 155u8, 177u8, 100u8, 236u8, 142u8, 204u8, 117u8, 95u8, 40u8, 201u8, 36u8, 32u8, 82u8, 38u8, @@ -40658,7 +44892,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::reap_identity`]."] + #[doc = "Reap the `IdentityInfo` of `who` from the Identity pallet of `T`, unreserving any"] + #[doc = "deposits held and removing storage items associated with `who`."] pub struct ReapIdentity { pub who: reap_identity::Who, } @@ -40680,7 +44915,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::poke_deposit`]."] + #[doc = "Update the deposit of `who`. Meant to be called by the system with an XCM `Transact`"] + #[doc = "Instruction."] pub struct PokeDeposit { pub who: poke_deposit::Who, } @@ -40695,7 +44931,8 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::reap_identity`]."] + #[doc = "Reap the `IdentityInfo` of `who` from the Identity pallet of `T`, unreserving any"] + #[doc = "deposits held and removing storage items associated with `who`."] pub fn reap_identity( &self, who: types::reap_identity::Who, @@ -40712,7 +44949,8 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::poke_deposit`]."] + #[doc = "Update the deposit of `who`. Meant to be called by the system with an XCM `Transact`"] + #[doc = "Instruction."] pub fn poke_deposit( &self, who: types::poke_deposit::Who, @@ -40809,7 +45047,11 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::sudo_schedule_para_initialize`]."] + #[doc = "Schedule a para to be initialized at the start of the next session."] + #[doc = ""] + #[doc = "This should only be used for TESTING and not on PRODUCTION chains. It automatically"] + #[doc = "assigns Coretime to the chain and increases the number of cores. Thus, there is no"] + #[doc = "running coretime chain required."] pub struct SudoScheduleParaInitialize { pub id: sudo_schedule_para_initialize::Id, pub genesis: sudo_schedule_para_initialize::Genesis, @@ -40834,7 +45076,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::sudo_schedule_para_cleanup`]."] + #[doc = "Schedule a para to be cleaned up at the start of the next session."] pub struct SudoScheduleParaCleanup { pub id: sudo_schedule_para_cleanup::Id, } @@ -40856,7 +45098,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::sudo_schedule_parathread_upgrade`]."] + #[doc = "Upgrade a parathread (on-demand parachain) to a lease holding parachain"] pub struct SudoScheduleParathreadUpgrade { pub id: sudo_schedule_parathread_upgrade::Id, } @@ -40878,7 +45120,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::sudo_schedule_parachain_downgrade`]."] + #[doc = "Downgrade a lease holding parachain to an on-demand parachain"] pub struct SudoScheduleParachainDowngrade { pub id: sudo_schedule_parachain_downgrade::Id, } @@ -40900,7 +45142,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::sudo_queue_downward_xcm`]."] + #[doc = "Send a downward XCM to the given para."] + #[doc = ""] + #[doc = "The given parachain should exist and the payload should not exceed the preconfigured"] + #[doc = "size `config.max_downward_message_size`."] pub struct SudoQueueDownwardXcm { pub id: sudo_queue_downward_xcm::Id, pub xcm: ::std::boxed::Box, @@ -40924,7 +45169,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::sudo_establish_hrmp_channel`]."] + #[doc = "Forcefully establish a channel from the sender to the recipient."] + #[doc = ""] + #[doc = "This is equivalent to sending an `Hrmp::hrmp_init_open_channel` extrinsic followed by"] + #[doc = "`Hrmp::hrmp_accept_open_channel`."] pub struct SudoEstablishHrmpChannel { pub sender: sudo_establish_hrmp_channel::Sender, pub recipient: sudo_establish_hrmp_channel::Recipient, @@ -40946,7 +45194,11 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::sudo_schedule_para_initialize`]."] + #[doc = "Schedule a para to be initialized at the start of the next session."] + #[doc = ""] + #[doc = "This should only be used for TESTING and not on PRODUCTION chains. It automatically"] + #[doc = "assigns Coretime to the chain and increases the number of cores. Thus, there is no"] + #[doc = "running coretime chain required."] pub fn sudo_schedule_para_initialize( &self, id: types::sudo_schedule_para_initialize::Id, @@ -40963,7 +45215,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::sudo_schedule_para_cleanup`]."] + #[doc = "Schedule a para to be cleaned up at the start of the next session."] pub fn sudo_schedule_para_cleanup( &self, id: types::sudo_schedule_para_cleanup::Id, @@ -40979,7 +45231,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::sudo_schedule_parathread_upgrade`]."] + #[doc = "Upgrade a parathread (on-demand parachain) to a lease holding parachain"] pub fn sudo_schedule_parathread_upgrade( &self, id: types::sudo_schedule_parathread_upgrade::Id, @@ -40996,7 +45248,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::sudo_schedule_parachain_downgrade`]."] + #[doc = "Downgrade a lease holding parachain to an on-demand parachain"] pub fn sudo_schedule_parachain_downgrade( &self, id: types::sudo_schedule_parachain_downgrade::Id, @@ -41013,7 +45265,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::sudo_queue_downward_xcm`]."] + #[doc = "Send a downward XCM to the given para."] + #[doc = ""] + #[doc = "The given parachain should exist and the payload should not exceed the preconfigured"] + #[doc = "size `config.max_downward_message_size`."] pub fn sudo_queue_downward_xcm( &self, id: types::sudo_queue_downward_xcm::Id, @@ -41033,7 +45288,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::sudo_establish_hrmp_channel`]."] + #[doc = "Forcefully establish a channel from the sender to the recipient."] + #[doc = ""] + #[doc = "This is equivalent to sending an `Hrmp::hrmp_init_open_channel` extrinsic followed by"] + #[doc = "`Hrmp::hrmp_accept_open_channel`."] pub fn sudo_establish_hrmp_channel( &self, sender: types::sudo_establish_hrmp_channel::Sender, @@ -41083,7 +45341,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::assign_perm_parachain_slot`]."] + #[doc = "Assign a permanent parachain slot and immediately create a lease for it."] pub struct AssignPermParachainSlot { pub id: assign_perm_parachain_slot::Id, } @@ -41105,7 +45363,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::assign_temp_parachain_slot`]."] + #[doc = "Assign a temporary parachain slot. The function tries to create a lease for it"] + #[doc = "immediately if `SlotLeasePeriodStart::Current` is specified, and if the number"] + #[doc = "of currently active temporary slots is below `MaxTemporarySlotPerLeasePeriod`."] pub struct AssignTempParachainSlot { pub id: assign_temp_parachain_slot::Id, pub lease_period_start: assign_temp_parachain_slot::LeasePeriodStart, @@ -41129,7 +45389,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::unassign_parachain_slot`]."] + #[doc = "Unassign a permanent or temporary parachain slot"] pub struct UnassignParachainSlot { pub id: unassign_parachain_slot::Id, } @@ -41151,7 +45411,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_max_permanent_slots`]."] + #[doc = "Sets the storage value [`MaxPermanentSlots`]."] pub struct SetMaxPermanentSlots { pub slots: set_max_permanent_slots::Slots, } @@ -41173,7 +45433,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_max_temporary_slots`]."] + #[doc = "Sets the storage value [`MaxTemporarySlots`]."] pub struct SetMaxTemporarySlots { pub slots: set_max_temporary_slots::Slots, } @@ -41188,7 +45448,7 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::assign_perm_parachain_slot`]."] + #[doc = "Assign a permanent parachain slot and immediately create a lease for it."] pub fn assign_perm_parachain_slot( &self, id: types::assign_perm_parachain_slot::Id, @@ -41204,7 +45464,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::assign_temp_parachain_slot`]."] + #[doc = "Assign a temporary parachain slot. The function tries to create a lease for it"] + #[doc = "immediately if `SlotLeasePeriodStart::Current` is specified, and if the number"] + #[doc = "of currently active temporary slots is below `MaxTemporarySlotPerLeasePeriod`."] pub fn assign_temp_parachain_slot( &self, id: types::assign_temp_parachain_slot::Id, @@ -41225,7 +45487,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::unassign_parachain_slot`]."] + #[doc = "Unassign a permanent or temporary parachain slot"] pub fn unassign_parachain_slot( &self, id: types::unassign_parachain_slot::Id, @@ -41242,7 +45504,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_max_permanent_slots`]."] + #[doc = "Sets the storage value [`MaxPermanentSlots`]."] pub fn set_max_permanent_slots( &self, slots: types::set_max_permanent_slots::Slots, @@ -41258,7 +45520,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_max_temporary_slots`]."] + #[doc = "Sets the storage value [`MaxTemporarySlots`]."] pub fn set_max_temporary_slots( &self, slots: types::set_max_temporary_slots::Slots, @@ -41407,7 +45669,7 @@ pub mod api { pub fn permanent_slots_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::permanent_slots::PermanentSlots, (), (), @@ -41416,7 +45678,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "AssignedSlots", "PermanentSlots", - vec![], + (), [ 133u8, 179u8, 221u8, 222u8, 50u8, 75u8, 158u8, 137u8, 167u8, 190u8, 19u8, 237u8, 201u8, 44u8, 86u8, 64u8, 57u8, 61u8, 96u8, 112u8, 218u8, @@ -41430,7 +45692,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::permanent_slots::PermanentSlots, ::subxt::storage::address::Yes, (), @@ -41439,9 +45701,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "AssignedSlots", "PermanentSlots", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 133u8, 179u8, 221u8, 222u8, 50u8, 75u8, 158u8, 137u8, 167u8, 190u8, 19u8, 237u8, 201u8, 44u8, 86u8, 64u8, 57u8, 61u8, 96u8, 112u8, 218u8, @@ -41454,7 +45714,7 @@ pub mod api { pub fn permanent_slot_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::permanent_slot_count::PermanentSlotCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -41463,7 +45723,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "AssignedSlots", "PermanentSlotCount", - vec![], + (), [ 57u8, 211u8, 19u8, 233u8, 105u8, 201u8, 166u8, 99u8, 53u8, 217u8, 23u8, 64u8, 216u8, 129u8, 21u8, 36u8, 234u8, 24u8, 57u8, 99u8, 13u8, 205u8, @@ -41475,7 +45735,7 @@ pub mod api { pub fn temporary_slots_iter( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::temporary_slots::TemporarySlots, (), (), @@ -41484,7 +45744,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "AssignedSlots", "TemporarySlots", - vec![], + (), [ 184u8, 245u8, 181u8, 90u8, 169u8, 232u8, 108u8, 3u8, 153u8, 4u8, 176u8, 170u8, 230u8, 163u8, 236u8, 111u8, 196u8, 218u8, 154u8, 125u8, 102u8, @@ -41498,7 +45758,7 @@ pub mod api { &self, _0: impl ::std::borrow::Borrow, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + ::subxt::storage::address::StaticStorageKey, types::temporary_slots::TemporarySlots, ::subxt::storage::address::Yes, (), @@ -41507,9 +45767,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "AssignedSlots", "TemporarySlots", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], + ::subxt::storage::address::StaticStorageKey::new(_0.borrow()), [ 184u8, 245u8, 181u8, 90u8, 169u8, 232u8, 108u8, 3u8, 153u8, 4u8, 176u8, 170u8, 230u8, 163u8, 236u8, 111u8, 196u8, 218u8, 154u8, 125u8, 102u8, @@ -41522,7 +45780,7 @@ pub mod api { pub fn temporary_slot_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::temporary_slot_count::TemporarySlotCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -41531,7 +45789,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "AssignedSlots", "TemporarySlotCount", - vec![], + (), [ 218u8, 236u8, 69u8, 75u8, 224u8, 60u8, 9u8, 197u8, 217u8, 4u8, 210u8, 55u8, 125u8, 106u8, 239u8, 208u8, 115u8, 105u8, 94u8, 223u8, 219u8, @@ -41543,7 +45801,7 @@ pub mod api { pub fn active_temporary_slot_count( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::active_temporary_slot_count::ActiveTemporarySlotCount, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -41552,7 +45810,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "AssignedSlots", "ActiveTemporarySlotCount", - vec![], + (), [ 153u8, 99u8, 232u8, 164u8, 137u8, 10u8, 232u8, 172u8, 78u8, 4u8, 69u8, 178u8, 245u8, 220u8, 56u8, 251u8, 60u8, 238u8, 127u8, 246u8, 60u8, @@ -41565,7 +45823,7 @@ pub mod api { pub fn max_temporary_slots( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::max_temporary_slots::MaxTemporarySlots, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -41574,7 +45832,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "AssignedSlots", "MaxTemporarySlots", - vec![], + (), [ 129u8, 130u8, 136u8, 77u8, 149u8, 130u8, 130u8, 195u8, 150u8, 114u8, 199u8, 133u8, 86u8, 252u8, 149u8, 149u8, 131u8, 248u8, 70u8, 39u8, @@ -41587,7 +45845,7 @@ pub mod api { pub fn max_permanent_slots( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::max_permanent_slots::MaxPermanentSlots, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -41596,7 +45854,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "AssignedSlots", "MaxPermanentSlots", - vec![], + (), [ 20u8, 72u8, 203u8, 62u8, 120u8, 21u8, 97u8, 9u8, 138u8, 135u8, 67u8, 152u8, 131u8, 197u8, 59u8, 80u8, 226u8, 148u8, 159u8, 122u8, 34u8, @@ -41680,7 +45938,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::register_validators`]."] + #[doc = "Add new validators to the set."] + #[doc = ""] + #[doc = "The new validators will be active from current session + 2."] pub struct RegisterValidators { pub validators: register_validators::Validators, } @@ -41702,7 +45962,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::deregister_validators`]."] + #[doc = "Remove validators from the set."] + #[doc = ""] + #[doc = "The removed validators will be deactivated from current session + 2."] pub struct DeregisterValidators { pub validators: deregister_validators::Validators, } @@ -41717,7 +45979,9 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::register_validators`]."] + #[doc = "Add new validators to the set."] + #[doc = ""] + #[doc = "The new validators will be active from current session + 2."] pub fn register_validators( &self, validators: types::register_validators::Validators, @@ -41734,7 +45998,9 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::deregister_validators`]."] + #[doc = "Remove validators from the set."] + #[doc = ""] + #[doc = "The removed validators will be deactivated from current session + 2."] pub fn deregister_validators( &self, validators: types::deregister_validators::Validators, @@ -41817,7 +46083,7 @@ pub mod api { pub fn validators_to_retire( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::validators_to_retire::ValidatorsToRetire, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -41826,7 +46092,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ValidatorManager", "ValidatorsToRetire", - vec![], + (), [ 137u8, 92u8, 99u8, 157u8, 254u8, 166u8, 190u8, 64u8, 111u8, 212u8, 37u8, 90u8, 164u8, 0u8, 31u8, 15u8, 83u8, 21u8, 225u8, 7u8, 57u8, @@ -41838,7 +46104,7 @@ pub mod api { pub fn validators_to_add( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::validators_to_add::ValidatorsToAdd, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -41847,7 +46113,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "ValidatorManager", "ValidatorsToAdd", - vec![], + (), [ 168u8, 209u8, 123u8, 225u8, 168u8, 62u8, 18u8, 174u8, 164u8, 161u8, 228u8, 179u8, 251u8, 112u8, 210u8, 173u8, 24u8, 177u8, 111u8, 129u8, @@ -41882,7 +46148,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::control_auto_migration`]."] + #[doc = "Control the automatic migration."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be [`Config::ControlOrigin`]."] pub struct ControlAutoMigration { pub maybe_config: control_auto_migration::MaybeConfig, } @@ -41906,7 +46174,27 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::continue_migrate`]."] + #[doc = "Continue the migration for the given `limits`."] + #[doc = ""] + #[doc = "The dispatch origin of this call can be any signed account."] + #[doc = ""] + #[doc = "This transaction has NO MONETARY INCENTIVES. calling it will not reward anyone. Albeit,"] + #[doc = "Upon successful execution, the transaction fee is returned."] + #[doc = ""] + #[doc = "The (potentially over-estimated) of the byte length of all the data read must be"] + #[doc = "provided for up-front fee-payment and weighing. In essence, the caller is guaranteeing"] + #[doc = "that executing the current `MigrationTask` with the given `limits` will not exceed"] + #[doc = "`real_size_upper` bytes of read data."] + #[doc = ""] + #[doc = "The `witness_task` is merely a helper to prevent the caller from being slashed or"] + #[doc = "generally trigger a migration that they do not intend. This parameter is just a message"] + #[doc = "from caller, saying that they believed `witness_task` was the last state of the"] + #[doc = "migration, and they only wish for their transaction to do anything, if this assumption"] + #[doc = "holds. In case `witness_task` does not match, the transaction fails."] + #[doc = ""] + #[doc = "Based on the documentation of [`MigrationTask::migrate_until_exhaustion`], the"] + #[doc = "recommended way of doing this is to pass a `limit` that only bounds `count`, as the"] + #[doc = "`size` limit can always be overwritten."] pub struct ContinueMigrate { pub limits: continue_migrate::Limits, pub real_size_upper: continue_migrate::RealSizeUpper, @@ -41934,7 +46222,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::migrate_custom_top`]."] + #[doc = "Migrate the list of top keys by iterating each of them one by one."] + #[doc = ""] + #[doc = "This does not affect the global migration process tracker ([`MigrationProcess`]), and"] + #[doc = "should only be used in case any keys are leftover due to a bug."] pub struct MigrateCustomTop { pub keys: migrate_custom_top::Keys, pub witness_size: migrate_custom_top::WitnessSize, @@ -41958,7 +46249,12 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::migrate_custom_child`]."] + #[doc = "Migrate the list of child keys by iterating each of them one by one."] + #[doc = ""] + #[doc = "All of the given child keys must be present under one `child_root`."] + #[doc = ""] + #[doc = "This does not affect the global migration process tracker ([`MigrationProcess`]), and"] + #[doc = "should only be used in case any keys are leftover due to a bug."] pub struct MigrateCustomChild { pub root: migrate_custom_child::Root, pub child_keys: migrate_custom_child::ChildKeys, @@ -41984,7 +46280,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_signed_max_limits`]."] + #[doc = "Set the maximum limit of the signed migration."] pub struct SetSignedMaxLimits { pub limits: set_signed_max_limits::Limits, } @@ -42007,7 +46303,15 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::force_set_progress`]."] + #[doc = "Forcefully set the progress the running migration."] + #[doc = ""] + #[doc = "This is only useful in one case: the next key to migrate is too big to be migrated with"] + #[doc = "a signed account, in a parachain context, and we simply want to skip it. A reasonable"] + #[doc = "example of this would be `:code:`, which is both very expensive to migrate, and commonly"] + #[doc = "used, so probably it is already migrated."] + #[doc = ""] + #[doc = "In case you mess things up, you can also, in principle, use this to reset the migration"] + #[doc = "process."] pub struct ForceSetProgress { pub progress_top: force_set_progress::ProgressTop, pub progress_child: force_set_progress::ProgressChild, @@ -42026,7 +46330,9 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::control_auto_migration`]."] + #[doc = "Control the automatic migration."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be [`Config::ControlOrigin`]."] pub fn control_auto_migration( &self, maybe_config: types::control_auto_migration::MaybeConfig, @@ -42042,7 +46348,27 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::continue_migrate`]."] + #[doc = "Continue the migration for the given `limits`."] + #[doc = ""] + #[doc = "The dispatch origin of this call can be any signed account."] + #[doc = ""] + #[doc = "This transaction has NO MONETARY INCENTIVES. calling it will not reward anyone. Albeit,"] + #[doc = "Upon successful execution, the transaction fee is returned."] + #[doc = ""] + #[doc = "The (potentially over-estimated) of the byte length of all the data read must be"] + #[doc = "provided for up-front fee-payment and weighing. In essence, the caller is guaranteeing"] + #[doc = "that executing the current `MigrationTask` with the given `limits` will not exceed"] + #[doc = "`real_size_upper` bytes of read data."] + #[doc = ""] + #[doc = "The `witness_task` is merely a helper to prevent the caller from being slashed or"] + #[doc = "generally trigger a migration that they do not intend. This parameter is just a message"] + #[doc = "from caller, saying that they believed `witness_task` was the last state of the"] + #[doc = "migration, and they only wish for their transaction to do anything, if this assumption"] + #[doc = "holds. In case `witness_task` does not match, the transaction fails."] + #[doc = ""] + #[doc = "Based on the documentation of [`MigrationTask::migrate_until_exhaustion`], the"] + #[doc = "recommended way of doing this is to pass a `limit` that only bounds `count`, as the"] + #[doc = "`size` limit can always be overwritten."] pub fn continue_migrate( &self, limits: types::continue_migrate::Limits, @@ -42065,7 +46391,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::migrate_custom_top`]."] + #[doc = "Migrate the list of top keys by iterating each of them one by one."] + #[doc = ""] + #[doc = "This does not affect the global migration process tracker ([`MigrationProcess`]), and"] + #[doc = "should only be used in case any keys are leftover due to a bug."] pub fn migrate_custom_top( &self, keys: types::migrate_custom_top::Keys, @@ -42082,7 +46411,12 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::migrate_custom_child`]."] + #[doc = "Migrate the list of child keys by iterating each of them one by one."] + #[doc = ""] + #[doc = "All of the given child keys must be present under one `child_root`."] + #[doc = ""] + #[doc = "This does not affect the global migration process tracker ([`MigrationProcess`]), and"] + #[doc = "should only be used in case any keys are leftover due to a bug."] pub fn migrate_custom_child( &self, root: types::migrate_custom_child::Root, @@ -42104,7 +46438,7 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::set_signed_max_limits`]."] + #[doc = "Set the maximum limit of the signed migration."] pub fn set_signed_max_limits( &self, limits: types::set_signed_max_limits::Limits, @@ -42120,7 +46454,15 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::force_set_progress`]."] + #[doc = "Forcefully set the progress the running migration."] + #[doc = ""] + #[doc = "This is only useful in one case: the next key to migrate is too big to be migrated with"] + #[doc = "a signed account, in a parachain context, and we simply want to skip it. A reasonable"] + #[doc = "example of this would be `:code:`, which is both very expensive to migrate, and commonly"] + #[doc = "used, so probably it is already migrated."] + #[doc = ""] + #[doc = "In case you mess things up, you can also, in principle, use this to reset the migration"] + #[doc = "process."] pub fn force_set_progress( &self, progress_top: types::force_set_progress::ProgressTop, @@ -42268,7 +46610,7 @@ pub mod api { pub fn migration_process( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::migration_process::MigrationProcess, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -42277,7 +46619,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "StateTrieMigration", "MigrationProcess", - vec![], + (), [ 119u8, 172u8, 143u8, 118u8, 90u8, 3u8, 154u8, 185u8, 165u8, 165u8, 249u8, 230u8, 77u8, 14u8, 221u8, 146u8, 75u8, 243u8, 69u8, 209u8, 79u8, @@ -42291,7 +46633,7 @@ pub mod api { pub fn auto_limits( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::auto_limits::AutoLimits, ::subxt::storage::address::Yes, ::subxt::storage::address::Yes, @@ -42300,7 +46642,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "StateTrieMigration", "AutoLimits", - vec![], + (), [ 225u8, 29u8, 94u8, 66u8, 169u8, 230u8, 106u8, 20u8, 238u8, 81u8, 238u8, 183u8, 185u8, 74u8, 94u8, 58u8, 107u8, 174u8, 228u8, 10u8, 156u8, @@ -42314,7 +46656,7 @@ pub mod api { pub fn signed_migration_max_limits( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::signed_migration_max_limits::SignedMigrationMaxLimits, ::subxt::storage::address::Yes, (), @@ -42323,7 +46665,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "StateTrieMigration", "SignedMigrationMaxLimits", - vec![], + (), [ 121u8, 97u8, 145u8, 237u8, 10u8, 145u8, 206u8, 119u8, 15u8, 12u8, 200u8, 24u8, 231u8, 140u8, 248u8, 227u8, 202u8, 78u8, 93u8, 134u8, @@ -42395,7 +46737,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See `Pallet::fill_block`."] + #[doc = "A dispatch that will fill the block weight up to the given ratio."] pub struct FillBlock { pub ratio: fill_block::Ratio, } @@ -42417,7 +46759,6 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See `Pallet::trigger_defensive`."] pub struct TriggerDefensive; impl ::subxt::blocks::StaticExtrinsic for TriggerDefensive { const PALLET: &'static str = "RootTesting"; @@ -42426,7 +46767,7 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See `Pallet::fill_block`."] + #[doc = "A dispatch that will fill the block weight up to the given ratio."] pub fn fill_block( &self, ratio: types::fill_block::Ratio, @@ -42442,7 +46783,6 @@ pub mod api { ], ) } - #[doc = "See `Pallet::trigger_defensive`."] pub fn trigger_defensive(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "RootTesting", @@ -42503,7 +46843,7 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::sudo`]."] + #[doc = "Authenticates the sudo key and dispatches a function call with `Root` origin."] pub struct Sudo { pub call: ::std::boxed::Box, } @@ -42525,7 +46865,11 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::sudo_unchecked_weight`]."] + #[doc = "Authenticates the sudo key and dispatches a function call with `Root` origin."] + #[doc = "This function does not check the weight of the call, and instead allows the"] + #[doc = "Sudo user to specify the weight of the call."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] pub struct SudoUncheckedWeight { pub call: ::std::boxed::Box, pub weight: sudo_unchecked_weight::Weight, @@ -42549,7 +46893,8 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::set_key`]."] + #[doc = "Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo"] + #[doc = "key."] pub struct SetKey { pub new: set_key::New, } @@ -42571,7 +46916,10 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::sudo_as`]."] + #[doc = "Authenticates the sudo key and dispatches a function call with `Signed` origin from"] + #[doc = "a given account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] pub struct SudoAs { pub who: sudo_as::Who, pub call: ::std::boxed::Box, @@ -42595,7 +46943,9 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "See [`Pallet::remove_key`]."] + #[doc = "Permanently removes the sudo key."] + #[doc = ""] + #[doc = "**This cannot be un-done.**"] pub struct RemoveKey; impl ::subxt::blocks::StaticExtrinsic for RemoveKey { const PALLET: &'static str = "Sudo"; @@ -42604,7 +46954,7 @@ pub mod api { } pub struct TransactionApi; impl TransactionApi { - #[doc = "See [`Pallet::sudo`]."] + #[doc = "Authenticates the sudo key and dispatches a function call with `Root` origin."] pub fn sudo(&self, call: types::sudo::Call) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Sudo", @@ -42613,14 +46963,18 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 129u8, 167u8, 214u8, 9u8, 176u8, 203u8, 82u8, 70u8, 118u8, 155u8, - 220u8, 184u8, 74u8, 62u8, 231u8, 49u8, 151u8, 73u8, 97u8, 9u8, 254u8, - 88u8, 44u8, 197u8, 205u8, 60u8, 182u8, 226u8, 195u8, 245u8, 253u8, - 241u8, + 182u8, 237u8, 136u8, 248u8, 26u8, 98u8, 159u8, 249u8, 13u8, 148u8, + 154u8, 119u8, 136u8, 199u8, 18u8, 226u8, 185u8, 128u8, 7u8, 47u8, + 253u8, 37u8, 106u8, 90u8, 143u8, 110u8, 108u8, 93u8, 246u8, 222u8, + 212u8, 108u8, ], ) } - #[doc = "See [`Pallet::sudo_unchecked_weight`]."] + #[doc = "Authenticates the sudo key and dispatches a function call with `Root` origin."] + #[doc = "This function does not check the weight of the call, and instead allows the"] + #[doc = "Sudo user to specify the weight of the call."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] pub fn sudo_unchecked_weight( &self, call: types::sudo_unchecked_weight::Call, @@ -42634,13 +46988,14 @@ pub mod api { weight, }, [ - 29u8, 141u8, 94u8, 132u8, 67u8, 244u8, 164u8, 193u8, 22u8, 27u8, 211u8, - 2u8, 138u8, 11u8, 60u8, 46u8, 32u8, 62u8, 190u8, 74u8, 153u8, 171u8, - 78u8, 200u8, 16u8, 60u8, 158u8, 114u8, 139u8, 232u8, 52u8, 40u8, + 114u8, 10u8, 181u8, 185u8, 46u8, 86u8, 44u8, 238u8, 76u8, 203u8, 182u8, + 103u8, 147u8, 81u8, 36u8, 237u8, 70u8, 139u8, 182u8, 117u8, 204u8, 0u8, + 146u8, 132u8, 251u8, 162u8, 65u8, 192u8, 61u8, 0u8, 43u8, 94u8, ], ) } - #[doc = "See [`Pallet::set_key`]."] + #[doc = "Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo"] + #[doc = "key."] pub fn set_key( &self, new: types::set_key::New, @@ -42656,7 +47011,10 @@ pub mod api { ], ) } - #[doc = "See [`Pallet::sudo_as`]."] + #[doc = "Authenticates the sudo key and dispatches a function call with `Signed` origin from"] + #[doc = "a given account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] pub fn sudo_as( &self, who: types::sudo_as::Who, @@ -42670,13 +47028,15 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 173u8, 60u8, 217u8, 75u8, 249u8, 36u8, 21u8, 151u8, 225u8, 59u8, 148u8, - 137u8, 185u8, 252u8, 116u8, 231u8, 19u8, 27u8, 240u8, 9u8, 177u8, 20u8, - 216u8, 90u8, 87u8, 7u8, 78u8, 173u8, 57u8, 221u8, 223u8, 42u8, + 74u8, 180u8, 112u8, 113u8, 184u8, 0u8, 87u8, 59u8, 130u8, 8u8, 222u8, + 55u8, 165u8, 38u8, 147u8, 196u8, 218u8, 10u8, 219u8, 217u8, 103u8, + 150u8, 112u8, 190u8, 59u8, 170u8, 24u8, 84u8, 84u8, 50u8, 33u8, 62u8, ], ) } - #[doc = "See [`Pallet::remove_key`]."] + #[doc = "Permanently removes the sudo key."] + #[doc = ""] + #[doc = "**This cannot be un-done.**"] pub fn remove_key(&self) -> ::subxt::tx::Payload { ::subxt::tx::Payload::new_static( "Sudo", @@ -42798,7 +47158,7 @@ pub mod api { pub fn key( &self, ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, + (), types::key::Key, ::subxt::storage::address::Yes, (), @@ -42807,7 +47167,7 @@ pub mod api { ::subxt::storage::address::Address::new_static( "Sudo", "Key", - vec![], + (), [ 72u8, 14u8, 225u8, 162u8, 205u8, 247u8, 227u8, 105u8, 116u8, 57u8, 4u8, 31u8, 84u8, 137u8, 227u8, 228u8, 133u8, 245u8, 206u8, 227u8, 117u8, @@ -43299,25 +47659,30 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::remark`]."] + #[doc = "Make some on-chain remark."] + #[doc = ""] + #[doc = "Can be executed by every `origin`."] remark { remark: ::std::vec::Vec<::core::primitive::u8>, }, #[codec(index = 1)] - #[doc = "See [`Pallet::set_heap_pages`]."] + #[doc = "Set the number of pages in the WebAssembly environment's heap."] set_heap_pages { pages: ::core::primitive::u64 }, #[codec(index = 2)] - #[doc = "See [`Pallet::set_code`]."] + #[doc = "Set the new runtime code."] set_code { code: ::std::vec::Vec<::core::primitive::u8>, }, #[codec(index = 3)] - #[doc = "See [`Pallet::set_code_without_checks`]."] + #[doc = "Set the new runtime code without doing any checks of the given `code`."] + #[doc = ""] + #[doc = "Note that runtime upgrades will not run if this is called with a not-increasing spec"] + #[doc = "version!"] set_code_without_checks { code: ::std::vec::Vec<::core::primitive::u8>, }, #[codec(index = 4)] - #[doc = "See [`Pallet::set_storage`]."] + #[doc = "Set some items of storage."] set_storage { items: ::std::vec::Vec<( ::std::vec::Vec<::core::primitive::u8>, @@ -43325,29 +47690,50 @@ pub mod api { )>, }, #[codec(index = 5)] - #[doc = "See [`Pallet::kill_storage`]."] + #[doc = "Kill some items from storage."] kill_storage { keys: ::std::vec::Vec<::std::vec::Vec<::core::primitive::u8>>, }, #[codec(index = 6)] - #[doc = "See [`Pallet::kill_prefix`]."] + #[doc = "Kill all storage items with a key that starts with the given prefix."] + #[doc = ""] + #[doc = "**NOTE:** We rely on the Root origin to provide us the number of subkeys under"] + #[doc = "the prefix we are removing to accurately calculate the weight of this function."] kill_prefix { prefix: ::std::vec::Vec<::core::primitive::u8>, subkeys: ::core::primitive::u32, }, #[codec(index = 7)] - #[doc = "See [`Pallet::remark_with_event`]."] + #[doc = "Make some on-chain remark and emit event."] remark_with_event { remark: ::std::vec::Vec<::core::primitive::u8>, }, #[codec(index = 9)] - #[doc = "See [`Pallet::authorize_upgrade`]."] + #[doc = "Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied"] + #[doc = "later."] + #[doc = ""] + #[doc = "This call requires Root origin."] authorize_upgrade { code_hash: ::subxt::utils::H256 }, #[codec(index = 10)] - #[doc = "See [`Pallet::authorize_upgrade_without_checks`]."] + #[doc = "Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied"] + #[doc = "later."] + #[doc = ""] + #[doc = "WARNING: This authorizes an upgrade that will take place without any safety checks, for"] + #[doc = "example that the spec name remains the same and that the version number increases. Not"] + #[doc = "recommended for normal use. Use `authorize_upgrade` instead."] + #[doc = ""] + #[doc = "This call requires Root origin."] authorize_upgrade_without_checks { code_hash: ::subxt::utils::H256 }, #[codec(index = 11)] - #[doc = "See [`Pallet::apply_authorized_upgrade`]."] + #[doc = "Provide the preimage (runtime binary) `code` for an upgrade that has been authorized."] + #[doc = ""] + #[doc = "If the authorization required a version check, this call will ensure the spec name"] + #[doc = "remains unchanged and that the spec version has increased."] + #[doc = ""] + #[doc = "Depending on the runtime's `OnSetCode` configuration, this function may directly apply"] + #[doc = "the new `code` in the same block or attempt to schedule the upgrade."] + #[doc = ""] + #[doc = "All origins are allowed."] apply_authorized_upgrade { code: ::std::vec::Vec<::core::primitive::u8>, }, @@ -43387,9 +47773,12 @@ pub mod api { #[doc = "The origin filter prevent the call to be dispatched."] CallFiltered, #[codec(index = 6)] + #[doc = "A multi-block migration is ongoing and prevents the current code from being replaced."] + MultiBlockMigrationsOngoing, + #[codec(index = 7)] #[doc = "No upgrade authorized."] NothingAuthorized, - #[codec(index = 7)] + #[codec(index = 8)] #[doc = "The submitted code is not authorized."] Unauthorized, } @@ -43540,7 +47929,10 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::create`]."] + #[doc = "Initialize a conversion rate to native balance for the given asset."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)"] create { asset_kind: ::std::boxed::Box< runtime_types::polkadot_runtime_common::impls::VersionedLocatableAsset, @@ -43548,7 +47940,10 @@ pub mod api { rate: runtime_types::sp_arithmetic::fixed_point::FixedU128, }, #[codec(index = 1)] - #[doc = "See [`Pallet::update`]."] + #[doc = "Update the conversion rate to native balance for the given asset."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)"] update { asset_kind: ::std::boxed::Box< runtime_types::polkadot_runtime_common::impls::VersionedLocatableAsset, @@ -43556,7 +47951,10 @@ pub mod api { rate: runtime_types::sp_arithmetic::fixed_point::FixedU128, }, #[codec(index = 2)] - #[doc = "See [`Pallet::remove`]."] + #[doc = "Remove an existing conversion rate to native balance for the given asset."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)"] remove { asset_kind: ::std::boxed::Box< runtime_types::polkadot_runtime_common::impls::VersionedLocatableAsset, @@ -43635,7 +48033,10 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::report_equivocation`]."] + #[doc = "Report authority equivocation/misbehavior. This method will verify"] + #[doc = "the equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence will"] + #[doc = "be reported."] report_equivocation { equivocation_proof: ::std::boxed::Box< runtime_types::sp_consensus_slots::EquivocationProof< @@ -43648,7 +48049,14 @@ pub mod api { key_owner_proof: runtime_types::sp_session::MembershipProof, }, #[codec(index = 1)] - #[doc = "See [`Pallet::report_equivocation_unsigned`]."] + #[doc = "Report authority equivocation/misbehavior. This method will verify"] + #[doc = "the equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence will"] + #[doc = "be reported."] + #[doc = "This extrinsic must be called unsigned and it is expected that only"] + #[doc = "block authors will call it (validated in `ValidateUnsigned`), as such"] + #[doc = "if the block author is defined it will be defined as the equivocation"] + #[doc = "reporter."] report_equivocation_unsigned { equivocation_proof: ::std::boxed::Box< runtime_types::sp_consensus_slots::EquivocationProof< @@ -43661,7 +48069,10 @@ pub mod api { key_owner_proof: runtime_types::sp_session::MembershipProof, }, #[codec(index = 2)] - #[doc = "See [`Pallet::plan_config_change`]."] + #[doc = "Plan an epoch config change. The epoch config change is recorded and will be enacted on"] + #[doc = "the next call to `enact_epoch_change`. The config will be activated one epoch after."] + #[doc = "Multiple calls to this method will replace any existing planned config change that had"] + #[doc = "not been enacted yet."] plan_config_change { config: runtime_types::sp_consensus_babe::digests::NextConfigDescriptor, }, @@ -43710,14 +48121,21 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::transfer_allow_death`]."] + #[doc = "Transfer some liquid free balance to another account."] + #[doc = ""] + #[doc = "`transfer_allow_death` will set the `FreeBalance` of the sender and receiver."] + #[doc = "If the sender's account is below the existential deposit as a result"] + #[doc = "of the transfer, the account will be reaped."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be `Signed` by the transactor."] transfer_allow_death { dest: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, #[codec(compact)] value: ::core::primitive::u128, }, #[codec(index = 2)] - #[doc = "See [`Pallet::force_transfer`]."] + #[doc = "Exactly as `transfer_allow_death`, except the origin must be root and the source account"] + #[doc = "may be specified."] force_transfer { source: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, dest: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, @@ -43725,38 +48143,72 @@ pub mod api { value: ::core::primitive::u128, }, #[codec(index = 3)] - #[doc = "See [`Pallet::transfer_keep_alive`]."] + #[doc = "Same as the [`transfer_allow_death`] call, but with a check that the transfer will not"] + #[doc = "kill the origin account."] + #[doc = ""] + #[doc = "99% of the time you want [`transfer_allow_death`] instead."] + #[doc = ""] + #[doc = "[`transfer_allow_death`]: struct.Pallet.html#method.transfer"] transfer_keep_alive { dest: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, #[codec(compact)] value: ::core::primitive::u128, }, #[codec(index = 4)] - #[doc = "See [`Pallet::transfer_all`]."] + #[doc = "Transfer the entire transferable balance from the caller account."] + #[doc = ""] + #[doc = "NOTE: This function only attempts to transfer _transferable_ balances. This means that"] + #[doc = "any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be"] + #[doc = "transferred by this function. To ensure that this function results in a killed account,"] + #[doc = "you might need to prepare the account by removing any reference counters, storage"] + #[doc = "deposits, etc..."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be Signed."] + #[doc = ""] + #[doc = "- `dest`: The recipient of the transfer."] + #[doc = "- `keep_alive`: A boolean to determine if the `transfer_all` operation should send all"] + #[doc = " of the funds the account has, causing the sender account to be killed (false), or"] + #[doc = " transfer everything except at least the existential deposit, which will guarantee to"] + #[doc = " keep the sender account alive (true)."] transfer_all { dest: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, keep_alive: ::core::primitive::bool, }, #[codec(index = 5)] - #[doc = "See [`Pallet::force_unreserve`]."] + #[doc = "Unreserve some balance from a user by force."] + #[doc = ""] + #[doc = "Can only be called by ROOT."] force_unreserve { who: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, amount: ::core::primitive::u128, }, #[codec(index = 6)] - #[doc = "See [`Pallet::upgrade_accounts`]."] + #[doc = "Upgrade a specified account."] + #[doc = ""] + #[doc = "- `origin`: Must be `Signed`."] + #[doc = "- `who`: The account to be upgraded."] + #[doc = ""] + #[doc = "This will waive the transaction fee if at least all but 10% of the accounts needed to"] + #[doc = "be upgraded. (We let some not have to be upgraded just in order to allow for the"] + #[doc = "possibililty of churn)."] upgrade_accounts { who: ::std::vec::Vec<::subxt::utils::AccountId32>, }, #[codec(index = 8)] - #[doc = "See [`Pallet::force_set_balance`]."] + #[doc = "Set the regular balance of a given account."] + #[doc = ""] + #[doc = "The dispatch origin for this call is `root`."] force_set_balance { who: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, #[codec(compact)] new_free: ::core::primitive::u128, }, #[codec(index = 9)] - #[doc = "See [`Pallet::force_adjust_total_issuance`]."] + #[doc = "Adjust the total issuance in a saturating way."] + #[doc = ""] + #[doc = "Can only be called by root and always needs a positive `delta`."] + #[doc = ""] + #[doc = "# Example"] force_adjust_total_issuance { direction: runtime_types::pallet_balances::types::AdjustmentDirection, #[codec(compact)] @@ -43776,14 +48228,21 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call2 { #[codec(index = 0)] - #[doc = "See [`Pallet::transfer_allow_death`]."] + #[doc = "Transfer some liquid free balance to another account."] + #[doc = ""] + #[doc = "`transfer_allow_death` will set the `FreeBalance` of the sender and receiver."] + #[doc = "If the sender's account is below the existential deposit as a result"] + #[doc = "of the transfer, the account will be reaped."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be `Signed` by the transactor."] transfer_allow_death { dest: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, #[codec(compact)] value: ::core::primitive::u128, }, #[codec(index = 2)] - #[doc = "See [`Pallet::force_transfer`]."] + #[doc = "Exactly as `transfer_allow_death`, except the origin must be root and the source account"] + #[doc = "may be specified."] force_transfer { source: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, dest: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, @@ -43791,38 +48250,72 @@ pub mod api { value: ::core::primitive::u128, }, #[codec(index = 3)] - #[doc = "See [`Pallet::transfer_keep_alive`]."] + #[doc = "Same as the [`transfer_allow_death`] call, but with a check that the transfer will not"] + #[doc = "kill the origin account."] + #[doc = ""] + #[doc = "99% of the time you want [`transfer_allow_death`] instead."] + #[doc = ""] + #[doc = "[`transfer_allow_death`]: struct.Pallet.html#method.transfer"] transfer_keep_alive { dest: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, #[codec(compact)] value: ::core::primitive::u128, }, #[codec(index = 4)] - #[doc = "See [`Pallet::transfer_all`]."] + #[doc = "Transfer the entire transferable balance from the caller account."] + #[doc = ""] + #[doc = "NOTE: This function only attempts to transfer _transferable_ balances. This means that"] + #[doc = "any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be"] + #[doc = "transferred by this function. To ensure that this function results in a killed account,"] + #[doc = "you might need to prepare the account by removing any reference counters, storage"] + #[doc = "deposits, etc..."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be Signed."] + #[doc = ""] + #[doc = "- `dest`: The recipient of the transfer."] + #[doc = "- `keep_alive`: A boolean to determine if the `transfer_all` operation should send all"] + #[doc = " of the funds the account has, causing the sender account to be killed (false), or"] + #[doc = " transfer everything except at least the existential deposit, which will guarantee to"] + #[doc = " keep the sender account alive (true)."] transfer_all { dest: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, keep_alive: ::core::primitive::bool, }, #[codec(index = 5)] - #[doc = "See [`Pallet::force_unreserve`]."] + #[doc = "Unreserve some balance from a user by force."] + #[doc = ""] + #[doc = "Can only be called by ROOT."] force_unreserve { who: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, amount: ::core::primitive::u128, }, #[codec(index = 6)] - #[doc = "See [`Pallet::upgrade_accounts`]."] + #[doc = "Upgrade a specified account."] + #[doc = ""] + #[doc = "- `origin`: Must be `Signed`."] + #[doc = "- `who`: The account to be upgraded."] + #[doc = ""] + #[doc = "This will waive the transaction fee if at least all but 10% of the accounts needed to"] + #[doc = "be upgraded. (We let some not have to be upgraded just in order to allow for the"] + #[doc = "possibililty of churn)."] upgrade_accounts { who: ::std::vec::Vec<::subxt::utils::AccountId32>, }, #[codec(index = 8)] - #[doc = "See [`Pallet::force_set_balance`]."] + #[doc = "Set the regular balance of a given account."] + #[doc = ""] + #[doc = "The dispatch origin for this call is `root`."] force_set_balance { who: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, #[codec(compact)] new_free: ::core::primitive::u128, }, #[codec(index = 9)] - #[doc = "See [`Pallet::force_adjust_total_issuance`]."] + #[doc = "Adjust the total issuance in a saturating way."] + #[doc = ""] + #[doc = "Can only be called by root and always needs a positive `delta`."] + #[doc = ""] + #[doc = "# Example"] force_adjust_total_issuance { direction: runtime_types::pallet_balances::types::AdjustmentDirection, #[codec(compact)] @@ -44338,7 +48831,10 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::report_equivocation`]."] + #[doc = "Report voter equivocation/misbehavior. This method will verify the"] + #[doc = "equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence"] + #[doc = "will be reported."] report_equivocation { equivocation_proof: ::std::boxed::Box< runtime_types::sp_consensus_beefy::EquivocationProof< @@ -44350,7 +48846,15 @@ pub mod api { key_owner_proof: runtime_types::sp_session::MembershipProof, }, #[codec(index = 1)] - #[doc = "See [`Pallet::report_equivocation_unsigned`]."] + #[doc = "Report voter equivocation/misbehavior. This method will verify the"] + #[doc = "equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence"] + #[doc = "will be reported."] + #[doc = ""] + #[doc = "This extrinsic must be called unsigned and it is expected that only"] + #[doc = "block authors will call it (validated in `ValidateUnsigned`), as such"] + #[doc = "if the block author is defined it will be defined as the equivocation"] + #[doc = "reporter."] report_equivocation_unsigned { equivocation_proof: ::std::boxed::Box< runtime_types::sp_consensus_beefy::EquivocationProof< @@ -44362,7 +48866,10 @@ pub mod api { key_owner_proof: runtime_types::sp_session::MembershipProof, }, #[codec(index = 2)] - #[doc = "See [`Pallet::set_new_genesis`]."] + #[doc = "Reset BEEFY consensus by setting a new BEEFY genesis at `delay_in_blocks` blocks in the"] + #[doc = "future."] + #[doc = ""] + #[doc = "Note: `delay_in_blocks` has to be at least 1."] set_new_genesis { delay_in_blocks: ::core::primitive::u32, }, @@ -44411,20 +48918,42 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::propose_bounty`]."] + #[doc = "Propose a new bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Payment: `TipReportDepositBase` will be reserved from the origin account, as well as"] + #[doc = "`DataDepositPerByte` for each byte in `reason`. It will be unreserved upon approval,"] + #[doc = "or slashed when rejected."] + #[doc = ""] + #[doc = "- `curator`: The curator account whom will manage this bounty."] + #[doc = "- `fee`: The curator fee."] + #[doc = "- `value`: The total payment amount of this bounty, curator fee included."] + #[doc = "- `description`: The description of this bounty."] propose_bounty { #[codec(compact)] value: ::core::primitive::u128, description: ::std::vec::Vec<::core::primitive::u8>, }, #[codec(index = 1)] - #[doc = "See [`Pallet::approve_bounty`]."] + #[doc = "Approve a bounty proposal. At a later time, the bounty will be funded and become active"] + #[doc = "and the original deposit will be returned."] + #[doc = ""] + #[doc = "May only be called from `T::SpendOrigin`."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] approve_bounty { #[codec(compact)] bounty_id: ::core::primitive::u32, }, #[codec(index = 2)] - #[doc = "See [`Pallet::propose_curator`]."] + #[doc = "Propose a curator to a funded bounty."] + #[doc = ""] + #[doc = "May only be called from `T::SpendOrigin`."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] propose_curator { #[codec(compact)] bounty_id: ::core::primitive::u32, @@ -44433,38 +48962,92 @@ pub mod api { fee: ::core::primitive::u128, }, #[codec(index = 3)] - #[doc = "See [`Pallet::unassign_curator`]."] + #[doc = "Unassign curator from a bounty."] + #[doc = ""] + #[doc = "This function can only be called by the `RejectOrigin` a signed origin."] + #[doc = ""] + #[doc = "If this function is called by the `RejectOrigin`, we assume that the curator is"] + #[doc = "malicious or inactive. As a result, we will slash the curator when possible."] + #[doc = ""] + #[doc = "If the origin is the curator, we take this as a sign they are unable to do their job and"] + #[doc = "they willingly give up. We could slash them, but for now we allow them to recover their"] + #[doc = "deposit and exit without issue. (We may want to change this if it is abused.)"] + #[doc = ""] + #[doc = "Finally, the origin can be anyone if and only if the curator is \"inactive\". This allows"] + #[doc = "anyone in the community to call out that a curator is not doing their due diligence, and"] + #[doc = "we should pick a new curator. In this case the curator should also be slashed."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] unassign_curator { #[codec(compact)] bounty_id: ::core::primitive::u32, }, #[codec(index = 4)] - #[doc = "See [`Pallet::accept_curator`]."] + #[doc = "Accept the curator role for a bounty."] + #[doc = "A deposit will be reserved from curator and refund upon successful payout."] + #[doc = ""] + #[doc = "May only be called from the curator."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] accept_curator { #[codec(compact)] bounty_id: ::core::primitive::u32, }, #[codec(index = 5)] - #[doc = "See [`Pallet::award_bounty`]."] + #[doc = "Award bounty to a beneficiary account. The beneficiary will be able to claim the funds"] + #[doc = "after a delay."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the curator of this bounty."] + #[doc = ""] + #[doc = "- `bounty_id`: Bounty ID to award."] + #[doc = "- `beneficiary`: The beneficiary account whom will receive the payout."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] award_bounty { #[codec(compact)] bounty_id: ::core::primitive::u32, beneficiary: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 6)] - #[doc = "See [`Pallet::claim_bounty`]."] + #[doc = "Claim the payout from an awarded bounty after payout delay."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the beneficiary of this bounty."] + #[doc = ""] + #[doc = "- `bounty_id`: Bounty ID to claim."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] claim_bounty { #[codec(compact)] bounty_id: ::core::primitive::u32, }, #[codec(index = 7)] - #[doc = "See [`Pallet::close_bounty`]."] + #[doc = "Cancel a proposed or active bounty. All the funds will be sent to treasury and"] + #[doc = "the curator deposit will be unreserved if possible."] + #[doc = ""] + #[doc = "Only `T::RejectOrigin` is able to cancel a bounty."] + #[doc = ""] + #[doc = "- `bounty_id`: Bounty ID to cancel."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] close_bounty { #[codec(compact)] bounty_id: ::core::primitive::u32, }, #[codec(index = 8)] - #[doc = "See [`Pallet::extend_bounty_expiry`]."] + #[doc = "Extend the expiry time of an active bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the curator of this bounty."] + #[doc = ""] + #[doc = "- `bounty_id`: Bounty ID to extend."] + #[doc = "- `remark`: additional information."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] extend_bounty_expiry { #[codec(compact)] bounty_id: ::core::primitive::u32, @@ -44669,7 +49252,25 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::add_child_bounty`]."] + #[doc = "Add a new child-bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the curator of parent"] + #[doc = "bounty and the parent bounty must be in \"active\" state."] + #[doc = ""] + #[doc = "Child-bounty gets added successfully & fund gets transferred from"] + #[doc = "parent bounty to child-bounty account, if parent bounty has enough"] + #[doc = "funds, else the call fails."] + #[doc = ""] + #[doc = "Upper bound to maximum number of active child bounties that can be"] + #[doc = "added are managed via runtime trait config"] + #[doc = "[`Config::MaxActiveChildBountyCount`]."] + #[doc = ""] + #[doc = "If the call is success, the status of child-bounty is updated to"] + #[doc = "\"Added\"."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty for which child-bounty is being added."] + #[doc = "- `value`: Value for executing the proposal."] + #[doc = "- `description`: Text description for the child-bounty."] add_child_bounty { #[codec(compact)] parent_bounty_id: ::core::primitive::u32, @@ -44678,7 +49279,21 @@ pub mod api { description: ::std::vec::Vec<::core::primitive::u8>, }, #[codec(index = 1)] - #[doc = "See [`Pallet::propose_curator`]."] + #[doc = "Propose curator for funded child-bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be curator of parent bounty."] + #[doc = ""] + #[doc = "Parent bounty must be in active state, for this child-bounty call to"] + #[doc = "work."] + #[doc = ""] + #[doc = "Child-bounty must be in \"Added\" state, for processing the call. And"] + #[doc = "state of child-bounty is moved to \"CuratorProposed\" on successful"] + #[doc = "call completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] + #[doc = "- `curator`: Address of child-bounty curator."] + #[doc = "- `fee`: payment fee to child-bounty curator for execution."] propose_curator { #[codec(compact)] parent_bounty_id: ::core::primitive::u32, @@ -44689,7 +49304,25 @@ pub mod api { fee: ::core::primitive::u128, }, #[codec(index = 2)] - #[doc = "See [`Pallet::accept_curator`]."] + #[doc = "Accept the curator role for the child-bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the curator of this"] + #[doc = "child-bounty."] + #[doc = ""] + #[doc = "A deposit will be reserved from the curator and refund upon"] + #[doc = "successful payout or cancellation."] + #[doc = ""] + #[doc = "Fee for curator is deducted from curator fee of parent bounty."] + #[doc = ""] + #[doc = "Parent bounty must be in active state, for this child-bounty call to"] + #[doc = "work."] + #[doc = ""] + #[doc = "Child-bounty must be in \"CuratorProposed\" state, for processing the"] + #[doc = "call. And state of child-bounty is moved to \"Active\" on successful"] + #[doc = "call completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] accept_curator { #[codec(compact)] parent_bounty_id: ::core::primitive::u32, @@ -44697,7 +49330,40 @@ pub mod api { child_bounty_id: ::core::primitive::u32, }, #[codec(index = 3)] - #[doc = "See [`Pallet::unassign_curator`]."] + #[doc = "Unassign curator from a child-bounty."] + #[doc = ""] + #[doc = "The dispatch origin for this call can be either `RejectOrigin`, or"] + #[doc = "the curator of the parent bounty, or any signed origin."] + #[doc = ""] + #[doc = "For the origin other than T::RejectOrigin and the child-bounty"] + #[doc = "curator, parent bounty must be in active state, for this call to"] + #[doc = "work. We allow child-bounty curator and T::RejectOrigin to execute"] + #[doc = "this call irrespective of the parent bounty state."] + #[doc = ""] + #[doc = "If this function is called by the `RejectOrigin` or the"] + #[doc = "parent bounty curator, we assume that the child-bounty curator is"] + #[doc = "malicious or inactive. As a result, child-bounty curator deposit is"] + #[doc = "slashed."] + #[doc = ""] + #[doc = "If the origin is the child-bounty curator, we take this as a sign"] + #[doc = "that they are unable to do their job, and are willingly giving up."] + #[doc = "We could slash the deposit, but for now we allow them to unreserve"] + #[doc = "their deposit and exit without issue. (We may want to change this if"] + #[doc = "it is abused.)"] + #[doc = ""] + #[doc = "Finally, the origin can be anyone iff the child-bounty curator is"] + #[doc = "\"inactive\". Expiry update due of parent bounty is used to estimate"] + #[doc = "inactive state of child-bounty curator."] + #[doc = ""] + #[doc = "This allows anyone in the community to call out that a child-bounty"] + #[doc = "curator is not doing their due diligence, and we should pick a new"] + #[doc = "one. In this case the child-bounty curator deposit is slashed."] + #[doc = ""] + #[doc = "State of child-bounty is moved to Added state on successful call"] + #[doc = "completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] unassign_curator { #[codec(compact)] parent_bounty_id: ::core::primitive::u32, @@ -44705,7 +49371,23 @@ pub mod api { child_bounty_id: ::core::primitive::u32, }, #[codec(index = 4)] - #[doc = "See [`Pallet::award_child_bounty`]."] + #[doc = "Award child-bounty to a beneficiary."] + #[doc = ""] + #[doc = "The beneficiary will be able to claim the funds after a delay."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be the parent curator or"] + #[doc = "curator of this child-bounty."] + #[doc = ""] + #[doc = "Parent bounty must be in active state, for this child-bounty call to"] + #[doc = "work."] + #[doc = ""] + #[doc = "Child-bounty must be in active state, for processing the call. And"] + #[doc = "state of child-bounty is moved to \"PendingPayout\" on successful call"] + #[doc = "completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] + #[doc = "- `beneficiary`: Beneficiary account."] award_child_bounty { #[codec(compact)] parent_bounty_id: ::core::primitive::u32, @@ -44714,7 +49396,22 @@ pub mod api { beneficiary: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 5)] - #[doc = "See [`Pallet::claim_child_bounty`]."] + #[doc = "Claim the payout from an awarded child-bounty after payout delay."] + #[doc = ""] + #[doc = "The dispatch origin for this call may be any signed origin."] + #[doc = ""] + #[doc = "Call works independent of parent bounty state, No need for parent"] + #[doc = "bounty to be in active state."] + #[doc = ""] + #[doc = "The Beneficiary is paid out with agreed bounty value. Curator fee is"] + #[doc = "paid & curator deposit is unreserved."] + #[doc = ""] + #[doc = "Child-bounty must be in \"PendingPayout\" state, for processing the"] + #[doc = "call. And instance of child-bounty is removed from the state on"] + #[doc = "successful call completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] claim_child_bounty { #[codec(compact)] parent_bounty_id: ::core::primitive::u32, @@ -44722,7 +49419,28 @@ pub mod api { child_bounty_id: ::core::primitive::u32, }, #[codec(index = 6)] - #[doc = "See [`Pallet::close_child_bounty`]."] + #[doc = "Cancel a proposed or active child-bounty. Child-bounty account funds"] + #[doc = "are transferred to parent bounty account. The child-bounty curator"] + #[doc = "deposit may be unreserved if possible."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be either parent curator or"] + #[doc = "`T::RejectOrigin`."] + #[doc = ""] + #[doc = "If the state of child-bounty is `Active`, curator deposit is"] + #[doc = "unreserved."] + #[doc = ""] + #[doc = "If the state of child-bounty is `PendingPayout`, call fails &"] + #[doc = "returns `PendingPayout` error."] + #[doc = ""] + #[doc = "For the origin other than T::RejectOrigin, parent bounty must be in"] + #[doc = "active state, for this child-bounty call to work. For origin"] + #[doc = "T::RejectOrigin execution is forced."] + #[doc = ""] + #[doc = "Instance of child-bounty is removed from the state on successful"] + #[doc = "call completion."] + #[doc = ""] + #[doc = "- `parent_bounty_id`: Index of parent bounty."] + #[doc = "- `child_bounty_id`: Index of child bounty."] close_child_bounty { #[codec(compact)] parent_bounty_id: ::core::primitive::u32, @@ -44881,7 +49599,15 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::vote`]."] + #[doc = "Vote in a poll. If `vote.is_aye()`, the vote is to enact the proposal;"] + #[doc = "otherwise it is a vote to keep the status quo."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_."] + #[doc = ""] + #[doc = "- `poll_index`: The index of the poll to vote for."] + #[doc = "- `vote`: The vote configuration."] + #[doc = ""] + #[doc = "Weight: `O(R)` where R is the number of polls the voter has voted on."] vote { #[codec(compact)] poll_index: ::core::primitive::u32, @@ -44890,7 +49616,29 @@ pub mod api { >, }, #[codec(index = 1)] - #[doc = "See [`Pallet::delegate`]."] + #[doc = "Delegate the voting power (with some given conviction) of the sending account for a"] + #[doc = "particular class of polls."] + #[doc = ""] + #[doc = "The balance delegated is locked for as long as it's delegated, and thereafter for the"] + #[doc = "time appropriate for the conviction's lock period."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_, and the signing account must either:"] + #[doc = " - be delegating already; or"] + #[doc = " - have no voting activity (if there is, then it will need to be removed through"] + #[doc = " `remove_vote`)."] + #[doc = ""] + #[doc = "- `to`: The account whose voting the `target` account's voting power will follow."] + #[doc = "- `class`: The class of polls to delegate. To delegate multiple classes, multiple calls"] + #[doc = " to this function are required."] + #[doc = "- `conviction`: The conviction that will be attached to the delegated votes. When the"] + #[doc = " account is undelegated, the funds will be locked for the corresponding period."] + #[doc = "- `balance`: The amount of the account's balance to be used in delegating. This must not"] + #[doc = " be more than the account's current balance."] + #[doc = ""] + #[doc = "Emits `Delegated`."] + #[doc = ""] + #[doc = "Weight: `O(R)` where R is the number of polls the voter delegating to has"] + #[doc = " voted on. Weight is initially charged as if maximum votes, but is refunded later."] delegate { class: ::core::primitive::u16, to: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, @@ -44898,22 +49646,86 @@ pub mod api { balance: ::core::primitive::u128, }, #[codec(index = 2)] - #[doc = "See [`Pallet::undelegate`]."] + #[doc = "Undelegate the voting power of the sending account for a particular class of polls."] + #[doc = ""] + #[doc = "Tokens may be unlocked following once an amount of time consistent with the lock period"] + #[doc = "of the conviction with which the delegation was issued has passed."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_ and the signing account must be"] + #[doc = "currently delegating."] + #[doc = ""] + #[doc = "- `class`: The class of polls to remove the delegation from."] + #[doc = ""] + #[doc = "Emits `Undelegated`."] + #[doc = ""] + #[doc = "Weight: `O(R)` where R is the number of polls the voter delegating to has"] + #[doc = " voted on. Weight is initially charged as if maximum votes, but is refunded later."] undelegate { class: ::core::primitive::u16 }, #[codec(index = 3)] - #[doc = "See [`Pallet::unlock`]."] + #[doc = "Remove the lock caused by prior voting/delegating which has expired within a particular"] + #[doc = "class."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_."] + #[doc = ""] + #[doc = "- `class`: The class of polls to unlock."] + #[doc = "- `target`: The account to remove the lock on."] + #[doc = ""] + #[doc = "Weight: `O(R)` with R number of vote of target."] unlock { class: ::core::primitive::u16, target: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 4)] - #[doc = "See [`Pallet::remove_vote`]."] + #[doc = "Remove a vote for a poll."] + #[doc = ""] + #[doc = "If:"] + #[doc = "- the poll was cancelled, or"] + #[doc = "- the poll is ongoing, or"] + #[doc = "- the poll has ended such that"] + #[doc = " - the vote of the account was in opposition to the result; or"] + #[doc = " - there was no conviction to the account's vote; or"] + #[doc = " - the account made a split vote"] + #[doc = "...then the vote is removed cleanly and a following call to `unlock` may result in more"] + #[doc = "funds being available."] + #[doc = ""] + #[doc = "If, however, the poll has ended and:"] + #[doc = "- it finished corresponding to the vote of the account, and"] + #[doc = "- the account made a standard vote with conviction, and"] + #[doc = "- the lock period of the conviction is not over"] + #[doc = "...then the lock will be aggregated into the overall account's lock, which may involve"] + #[doc = "*overlocking* (where the two locks are combined into a single lock that is the maximum"] + #[doc = "of both the amount locked and the time is it locked for)."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_, and the signer must have a vote"] + #[doc = "registered for poll `index`."] + #[doc = ""] + #[doc = "- `index`: The index of poll of the vote to be removed."] + #[doc = "- `class`: Optional parameter, if given it indicates the class of the poll. For polls"] + #[doc = " which have finished or are cancelled, this must be `Some`."] + #[doc = ""] + #[doc = "Weight: `O(R + log R)` where R is the number of polls that `target` has voted on."] + #[doc = " Weight is calculated for the maximum number of vote."] remove_vote { class: ::core::option::Option<::core::primitive::u16>, index: ::core::primitive::u32, }, #[codec(index = 5)] - #[doc = "See [`Pallet::remove_other_vote`]."] + #[doc = "Remove a vote for a poll."] + #[doc = ""] + #[doc = "If the `target` is equal to the signer, then this function is exactly equivalent to"] + #[doc = "`remove_vote`. If not equal to the signer, then the vote must have expired,"] + #[doc = "either because the poll was cancelled, because the voter lost the poll or"] + #[doc = "because the conviction period is over."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be _Signed_."] + #[doc = ""] + #[doc = "- `target`: The account of the vote to be removed; this account must have voted for poll"] + #[doc = " `index`."] + #[doc = "- `index`: The index of poll of the vote to be removed."] + #[doc = "- `class`: The class of the poll."] + #[doc = ""] + #[doc = "Weight: `O(R + log R)` where R is the number of polls that `target` has voted on."] + #[doc = " Weight is calculated for the maximum number of vote."] remove_other_vote { target: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, class: ::core::primitive::u16, @@ -45145,7 +49957,10 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::report_equivocation`]."] + #[doc = "Report voter equivocation/misbehavior. This method will verify the"] + #[doc = "equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence"] + #[doc = "will be reported."] report_equivocation { equivocation_proof: ::std::boxed::Box< runtime_types::sp_consensus_grandpa::EquivocationProof< @@ -45156,7 +49971,15 @@ pub mod api { key_owner_proof: runtime_types::sp_session::MembershipProof, }, #[codec(index = 1)] - #[doc = "See [`Pallet::report_equivocation_unsigned`]."] + #[doc = "Report voter equivocation/misbehavior. This method will verify the"] + #[doc = "equivocation proof and validate the given key ownership proof"] + #[doc = "against the extracted offender. If both are valid, the offence"] + #[doc = "will be reported."] + #[doc = ""] + #[doc = "This extrinsic must be called unsigned and it is expected that only"] + #[doc = "block authors will call it (validated in `ValidateUnsigned`), as such"] + #[doc = "if the block author is defined it will be defined as the equivocation"] + #[doc = "reporter."] report_equivocation_unsigned { equivocation_proof: ::std::boxed::Box< runtime_types::sp_consensus_grandpa::EquivocationProof< @@ -45167,7 +49990,18 @@ pub mod api { key_owner_proof: runtime_types::sp_session::MembershipProof, }, #[codec(index = 2)] - #[doc = "See [`Pallet::note_stalled`]."] + #[doc = "Note that the current authority set of the GRANDPA finality gadget has stalled."] + #[doc = ""] + #[doc = "This will trigger a forced authority set change at the beginning of the next session, to"] + #[doc = "be enacted `delay` blocks after that. The `delay` should be high enough to safely assume"] + #[doc = "that the block signalling the forced change will not be re-orged e.g. 1000 blocks."] + #[doc = "The block production rate (which may be slowed down because of finality lagging) should"] + #[doc = "be taken into account when choosing the `delay`. The GRANDPA voters based on the new"] + #[doc = "authority will start voting on top of `best_finalized_block_number` for new finalized"] + #[doc = "blocks. `best_finalized_block_number` should be the highest of the latest finalized"] + #[doc = "block of all validators of the new authority set."] + #[doc = ""] + #[doc = "Only callable by root."] note_stalled { delay: ::core::primitive::u32, best_finalized_block_number: ::core::primitive::u32, @@ -45322,18 +50156,41 @@ pub mod api { #[doc = "Identity pallet declaration."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::add_registrar`]."] + #[doc = "Add a registrar to the system."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be `T::RegistrarOrigin`."] + #[doc = ""] + #[doc = "- `account`: the account of the registrar."] + #[doc = ""] + #[doc = "Emits `RegistrarAdded` if successful."] add_registrar { account: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 1)] - #[doc = "See [`Pallet::set_identity`]."] + #[doc = "Set an account's identity information and reserve the appropriate deposit."] + #[doc = ""] + #[doc = "If the account already has identity information, the deposit is taken as part payment"] + #[doc = "for the new deposit."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `info`: The identity information."] + #[doc = ""] + #[doc = "Emits `IdentitySet` if successful."] set_identity { info: ::std::boxed::Box, }, #[codec(index = 2)] - #[doc = "See [`Pallet::set_subs`]."] + #[doc = "Set the sub-accounts of the sender."] + #[doc = ""] + #[doc = "Payment: Any aggregate balance reserved by previous `set_subs` calls will be returned"] + #[doc = "and an amount `SubAccountDeposit` will be reserved for each item in `subs`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "identity."] + #[doc = ""] + #[doc = "- `subs`: The identity's (new) sub-accounts."] set_subs { subs: ::std::vec::Vec<( ::subxt::utils::AccountId32, @@ -45341,10 +50198,32 @@ pub mod api { )>, }, #[codec(index = 3)] - #[doc = "See [`Pallet::clear_identity`]."] + #[doc = "Clear an account's identity info and all sub-accounts and return all deposits."] + #[doc = ""] + #[doc = "Payment: All reserved balances on the account are returned."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "identity."] + #[doc = ""] + #[doc = "Emits `IdentityCleared` if successful."] clear_identity, #[codec(index = 4)] - #[doc = "See [`Pallet::request_judgement`]."] + #[doc = "Request a judgement from a registrar."] + #[doc = ""] + #[doc = "Payment: At most `max_fee` will be reserved for payment to the registrar if judgement"] + #[doc = "given."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a"] + #[doc = "registered identity."] + #[doc = ""] + #[doc = "- `reg_index`: The index of the registrar whose judgement is requested."] + #[doc = "- `max_fee`: The maximum fee that may be paid. This should just be auto-populated as:"] + #[doc = ""] + #[doc = "```nocompile"] + #[doc = "Self::registrars().get(reg_index).unwrap().fee"] + #[doc = "```"] + #[doc = ""] + #[doc = "Emits `JudgementRequested` if successful."] request_judgement { #[codec(compact)] reg_index: ::core::primitive::u32, @@ -45352,10 +50231,25 @@ pub mod api { max_fee: ::core::primitive::u128, }, #[codec(index = 5)] - #[doc = "See [`Pallet::cancel_request`]."] + #[doc = "Cancel a previous request."] + #[doc = ""] + #[doc = "Payment: A previously reserved deposit is returned on success."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a"] + #[doc = "registered identity."] + #[doc = ""] + #[doc = "- `reg_index`: The index of the registrar whose judgement is no longer requested."] + #[doc = ""] + #[doc = "Emits `JudgementUnrequested` if successful."] cancel_request { reg_index: ::core::primitive::u32 }, #[codec(index = 6)] - #[doc = "See [`Pallet::set_fee`]."] + #[doc = "Set the fee required for a judgement to be requested from a registrar."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must be the account"] + #[doc = "of the registrar whose index is `index`."] + #[doc = ""] + #[doc = "- `index`: the index of the registrar whose fee is to be set."] + #[doc = "- `fee`: the new fee."] set_fee { #[codec(compact)] index: ::core::primitive::u32, @@ -45363,21 +50257,47 @@ pub mod api { fee: ::core::primitive::u128, }, #[codec(index = 7)] - #[doc = "See [`Pallet::set_account_id`]."] + #[doc = "Change the account associated with a registrar."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must be the account"] + #[doc = "of the registrar whose index is `index`."] + #[doc = ""] + #[doc = "- `index`: the index of the registrar whose fee is to be set."] + #[doc = "- `new`: the new account ID."] set_account_id { #[codec(compact)] index: ::core::primitive::u32, new: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 8)] - #[doc = "See [`Pallet::set_fields`]."] + #[doc = "Set the field information for a registrar."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must be the account"] + #[doc = "of the registrar whose index is `index`."] + #[doc = ""] + #[doc = "- `index`: the index of the registrar whose fee is to be set."] + #[doc = "- `fields`: the fields that the registrar concerns themselves with."] set_fields { #[codec(compact)] index: ::core::primitive::u32, fields: ::core::primitive::u64, }, #[codec(index = 9)] - #[doc = "See [`Pallet::provide_judgement`]."] + #[doc = "Provide a judgement for an account's identity."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must be the account"] + #[doc = "of the registrar whose index is `reg_index`."] + #[doc = ""] + #[doc = "- `reg_index`: the index of the registrar whose judgement is being made."] + #[doc = "- `target`: the account whose identity the judgement is upon. This must be an account"] + #[doc = " with a registered identity."] + #[doc = "- `judgement`: the judgement of the registrar of index `reg_index` about `target`."] + #[doc = "- `identity`: The hash of the [`IdentityInformationProvider`] for that the judgement is"] + #[doc = " provided."] + #[doc = ""] + #[doc = "Note: Judgements do not apply to a username."] + #[doc = ""] + #[doc = "Emits `JudgementGiven` if successful."] provide_judgement { #[codec(compact)] reg_index: ::core::primitive::u32, @@ -45388,44 +50308,90 @@ pub mod api { identity: ::subxt::utils::H256, }, #[codec(index = 10)] - #[doc = "See [`Pallet::kill_identity`]."] + #[doc = "Remove an account's identity and sub-account information and slash the deposits."] + #[doc = ""] + #[doc = "Payment: Reserved balances from `set_subs` and `set_identity` are slashed and handled by"] + #[doc = "`Slash`. Verification request deposits are not returned; they should be cancelled"] + #[doc = "manually using `cancel_request`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must match `T::ForceOrigin`."] + #[doc = ""] + #[doc = "- `target`: the account whose identity the judgement is upon. This must be an account"] + #[doc = " with a registered identity."] + #[doc = ""] + #[doc = "Emits `IdentityKilled` if successful."] kill_identity { target: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 11)] - #[doc = "See [`Pallet::add_sub`]."] + #[doc = "Add the given account to the sender's subs."] + #[doc = ""] + #[doc = "Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated"] + #[doc = "to the sender."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "sub identity of `sub`."] add_sub { sub: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, data: runtime_types::pallet_identity::types::Data, }, #[codec(index = 12)] - #[doc = "See [`Pallet::rename_sub`]."] + #[doc = "Alter the associated name of the given sub-account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "sub identity of `sub`."] rename_sub { sub: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, data: runtime_types::pallet_identity::types::Data, }, #[codec(index = 13)] - #[doc = "See [`Pallet::remove_sub`]."] + #[doc = "Remove the given account from the sender's subs."] + #[doc = ""] + #[doc = "Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated"] + #[doc = "to the sender."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "sub identity of `sub`."] remove_sub { sub: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 14)] - #[doc = "See [`Pallet::quit_sub`]."] + #[doc = "Remove the sender as a sub-account."] + #[doc = ""] + #[doc = "Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated"] + #[doc = "to the sender (*not* the original depositor)."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have a registered"] + #[doc = "super-identity."] + #[doc = ""] + #[doc = "NOTE: This should not normally be used, but is provided in the case that the non-"] + #[doc = "controller of an account is maliciously registered as a sub-account."] quit_sub, #[codec(index = 15)] - #[doc = "See [`Pallet::add_username_authority`]."] + #[doc = "Add an `AccountId` with permission to grant usernames with a given `suffix` appended."] + #[doc = ""] + #[doc = "The authority can grant up to `allocation` usernames. To top up their allocation, they"] + #[doc = "should just issue (or request via governance) a new `add_username_authority` call."] add_username_authority { authority: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, suffix: ::std::vec::Vec<::core::primitive::u8>, allocation: ::core::primitive::u32, }, #[codec(index = 16)] - #[doc = "See [`Pallet::remove_username_authority`]."] + #[doc = "Remove `authority` from the username authorities."] remove_username_authority { authority: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 17)] - #[doc = "See [`Pallet::set_username_for`]."] + #[doc = "Set the username for `who`. Must be called by a username authority."] + #[doc = ""] + #[doc = "The authority must have an `allocation`. Users can either pre-sign their usernames or"] + #[doc = "accept them later."] + #[doc = ""] + #[doc = "Usernames must:"] + #[doc = " - Only contain lowercase ASCII characters or digits."] + #[doc = " - When combined with the suffix of the issuing authority be _less than_ the"] + #[doc = " `MaxUsernameLength`."] set_username_for { who: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, username: ::std::vec::Vec<::core::primitive::u8>, @@ -45433,28 +50399,32 @@ pub mod api { ::core::option::Option, }, #[codec(index = 18)] - #[doc = "See [`Pallet::accept_username`]."] + #[doc = "Accept a given username that an `authority` granted. The call must include the full"] + #[doc = "username, as in `username.suffix`."] accept_username { username: runtime_types::bounded_collections::bounded_vec::BoundedVec< ::core::primitive::u8, >, }, #[codec(index = 19)] - #[doc = "See [`Pallet::remove_expired_approval`]."] + #[doc = "Remove an expired username approval. The username was approved by an authority but never"] + #[doc = "accepted by the user and must now be beyond its expiration. The call must include the"] + #[doc = "full username, as in `username.suffix`."] remove_expired_approval { username: runtime_types::bounded_collections::bounded_vec::BoundedVec< ::core::primitive::u8, >, }, #[codec(index = 20)] - #[doc = "See [`Pallet::set_primary_username`]."] + #[doc = "Set a given username as the primary. The username should include the suffix."] set_primary_username { username: runtime_types::bounded_collections::bounded_vec::BoundedVec< ::core::primitive::u8, >, }, #[codec(index = 21)] - #[doc = "See [`Pallet::remove_dangling_username`]."] + #[doc = "Remove a username that corresponds to an account with no identity. Exists when a user"] + #[doc = "gets a username but then calls `clear_identity`."] remove_dangling_username { username: runtime_types::bounded_collections::bounded_vec::BoundedVec< ::core::primitive::u8, @@ -45855,26 +50825,82 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::claim`]."] + #[doc = "Assign an previously unassigned index."] + #[doc = ""] + #[doc = "Payment: `Deposit` is reserved from the sender account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `index`: the index to be claimed. This must not be in use."] + #[doc = ""] + #[doc = "Emits `IndexAssigned` if successful."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] claim { index: ::core::primitive::u32 }, #[codec(index = 1)] - #[doc = "See [`Pallet::transfer`]."] + #[doc = "Assign an index already owned by the sender to another account. The balance reservation"] + #[doc = "is effectively transferred to the new account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `index`: the index to be re-assigned. This must be owned by the sender."] + #[doc = "- `new`: the new owner of the index. This function is a no-op if it is equal to sender."] + #[doc = ""] + #[doc = "Emits `IndexAssigned` if successful."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] transfer { new: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, index: ::core::primitive::u32, }, #[codec(index = 2)] - #[doc = "See [`Pallet::free`]."] + #[doc = "Free up an index owned by the sender."] + #[doc = ""] + #[doc = "Payment: Any previous deposit placed for the index is unreserved in the sender account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must own the index."] + #[doc = ""] + #[doc = "- `index`: the index to be freed. This must be owned by the sender."] + #[doc = ""] + #[doc = "Emits `IndexFreed` if successful."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] free { index: ::core::primitive::u32 }, #[codec(index = 3)] - #[doc = "See [`Pallet::force_transfer`]."] + #[doc = "Force an index to an account. This doesn't require a deposit. If the index is already"] + #[doc = "held, then any deposit is reimbursed to its current owner."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] + #[doc = ""] + #[doc = "- `index`: the index to be (re-)assigned."] + #[doc = "- `new`: the new owner of the index. This function is a no-op if it is equal to sender."] + #[doc = "- `freeze`: if set to `true`, will freeze the index so it cannot be transferred."] + #[doc = ""] + #[doc = "Emits `IndexAssigned` if successful."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] force_transfer { new: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, index: ::core::primitive::u32, freeze: ::core::primitive::bool, }, #[codec(index = 4)] - #[doc = "See [`Pallet::freeze`]."] + #[doc = "Freeze an index so it will always point to the sender account. This consumes the"] + #[doc = "deposit."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the signing account must have a"] + #[doc = "non-frozen account `index`."] + #[doc = ""] + #[doc = "- `index`: the index to be frozen in place."] + #[doc = ""] + #[doc = "Emits `IndexFrozen` if successful."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] freeze { index: ::core::primitive::u32 }, } #[derive( @@ -45951,7 +50977,7 @@ pub mod api { #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { - # [codec (index = 0)] # [doc = "See [`Pallet::reap_page`]."] reap_page { message_origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page_index : :: core :: primitive :: u32 , } , # [codec (index = 1)] # [doc = "See [`Pallet::execute_overweight`]."] execute_overweight { message_origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page : :: core :: primitive :: u32 , index : :: core :: primitive :: u32 , weight_limit : runtime_types :: sp_weights :: weight_v2 :: Weight , } , } + # [codec (index = 0)] # [doc = "Remove a page which has no more messages remaining to be processed or is stale."] reap_page { message_origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page_index : :: core :: primitive :: u32 , } , # [codec (index = 1)] # [doc = "Execute an overweight message."] # [doc = ""] # [doc = "Temporary processing errors will be propagated whereas permanent errors are treated"] # [doc = "as success condition."] # [doc = ""] # [doc = "- `origin`: Must be `Signed`."] # [doc = "- `message_origin`: The origin from which the message to be executed arrived."] # [doc = "- `page`: The page in the queue in which the message to be executed is sitting."] # [doc = "- `index`: The index into the queue of the message to be executed."] # [doc = "- `weight_limit`: The maximum amount of weight allowed to be consumed in the execution"] # [doc = " of the message."] # [doc = ""] # [doc = "Benchmark complexity considerations: O(index + weight_limit)."] execute_overweight { message_origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page : :: core :: primitive :: u32 , index : :: core :: primitive :: u32 , weight_limit : runtime_types :: sp_weights :: weight_v2 :: Weight , } , } #[derive( :: subxt :: ext :: codec :: Decode, :: subxt :: ext :: codec :: Encode, @@ -46083,13 +51109,62 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::as_multi_threshold_1`]."] + #[doc = "Immediately dispatch a multi-signature call using a single approval from the caller."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `other_signatories`: The accounts (other than the sender) who are part of the"] + #[doc = "multi-signature, but do not participate in the approval process."] + #[doc = "- `call`: The call to be executed."] + #[doc = ""] + #[doc = "Result is equivalent to the dispatched result."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "O(Z + C) where Z is the length of the call and C its execution weight."] as_multi_threshold_1 { other_signatories: ::std::vec::Vec<::subxt::utils::AccountId32>, call: ::std::boxed::Box, }, #[codec(index = 1)] - #[doc = "See [`Pallet::as_multi`]."] + #[doc = "Register approval for a dispatch to be made from a deterministic composite account if"] + #[doc = "approved by a total of `threshold - 1` of `other_signatories`."] + #[doc = ""] + #[doc = "If there are enough, then dispatch the call."] + #[doc = ""] + #[doc = "Payment: `DepositBase` will be reserved if this is the first approval, plus"] + #[doc = "`threshold` times `DepositFactor`. It is returned once this dispatch happens or"] + #[doc = "is cancelled."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `threshold`: The total number of approvals for this dispatch before it is executed."] + #[doc = "- `other_signatories`: The accounts (other than the sender) who can approve this"] + #[doc = "dispatch. May not be empty."] + #[doc = "- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is"] + #[doc = "not the first approval, then it must be `Some`, with the timepoint (block number and"] + #[doc = "transaction index) of the first approval transaction."] + #[doc = "- `call`: The call to be executed."] + #[doc = ""] + #[doc = "NOTE: Unless this is the final approval, you will generally want to use"] + #[doc = "`approve_as_multi` instead, since it only requires a hash of the call."] + #[doc = ""] + #[doc = "Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise"] + #[doc = "on success, result is `Ok` and the result from the interior call, if it was executed,"] + #[doc = "may be found in the deposited `MultisigExecuted` event."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(S + Z + Call)`."] + #[doc = "- Up to one balance-reserve or unreserve operation."] + #[doc = "- One passthrough operation, one insert, both `O(S)` where `S` is the number of"] + #[doc = " signatories. `S` is capped by `MaxSignatories`, with weight being proportional."] + #[doc = "- One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len."] + #[doc = "- One encode & hash, both of complexity `O(S)`."] + #[doc = "- Up to one binary search and insert (`O(logS + S)`)."] + #[doc = "- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove."] + #[doc = "- One event."] + #[doc = "- The weight of the `call`."] + #[doc = "- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit"] + #[doc = " taken for its lifetime of `DepositBase + threshold * DepositFactor`."] as_multi { threshold: ::core::primitive::u16, other_signatories: ::std::vec::Vec<::subxt::utils::AccountId32>, @@ -46100,7 +51175,36 @@ pub mod api { max_weight: runtime_types::sp_weights::weight_v2::Weight, }, #[codec(index = 2)] - #[doc = "See [`Pallet::approve_as_multi`]."] + #[doc = "Register approval for a dispatch to be made from a deterministic composite account if"] + #[doc = "approved by a total of `threshold - 1` of `other_signatories`."] + #[doc = ""] + #[doc = "Payment: `DepositBase` will be reserved if this is the first approval, plus"] + #[doc = "`threshold` times `DepositFactor`. It is returned once this dispatch happens or"] + #[doc = "is cancelled."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `threshold`: The total number of approvals for this dispatch before it is executed."] + #[doc = "- `other_signatories`: The accounts (other than the sender) who can approve this"] + #[doc = "dispatch. May not be empty."] + #[doc = "- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is"] + #[doc = "not the first approval, then it must be `Some`, with the timepoint (block number and"] + #[doc = "transaction index) of the first approval transaction."] + #[doc = "- `call_hash`: The hash of the call to be executed."] + #[doc = ""] + #[doc = "NOTE: If this is the final approval, you will want to use `as_multi` instead."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(S)`."] + #[doc = "- Up to one balance-reserve or unreserve operation."] + #[doc = "- One passthrough operation, one insert, both `O(S)` where `S` is the number of"] + #[doc = " signatories. `S` is capped by `MaxSignatories`, with weight being proportional."] + #[doc = "- One encode & hash, both of complexity `O(S)`."] + #[doc = "- Up to one binary search and insert (`O(logS + S)`)."] + #[doc = "- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove."] + #[doc = "- One event."] + #[doc = "- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit"] + #[doc = " taken for its lifetime of `DepositBase + threshold * DepositFactor`."] approve_as_multi { threshold: ::core::primitive::u16, other_signatories: ::std::vec::Vec<::subxt::utils::AccountId32>, @@ -46111,7 +51215,27 @@ pub mod api { max_weight: runtime_types::sp_weights::weight_v2::Weight, }, #[codec(index = 3)] - #[doc = "See [`Pallet::cancel_as_multi`]."] + #[doc = "Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously"] + #[doc = "for this operation will be unreserved on success."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `threshold`: The total number of approvals for this dispatch before it is executed."] + #[doc = "- `other_signatories`: The accounts (other than the sender) who can approve this"] + #[doc = "dispatch. May not be empty."] + #[doc = "- `timepoint`: The timepoint (block number and transaction index) of the first approval"] + #[doc = "transaction for this dispatch."] + #[doc = "- `call_hash`: The hash of the call to be executed."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(S)`."] + #[doc = "- Up to one balance-reserve or unreserve operation."] + #[doc = "- One passthrough operation, one insert, both `O(S)` where `S` is the number of"] + #[doc = " signatories. `S` is capped by `MaxSignatories`, with weight being proportional."] + #[doc = "- One encode & hash, both of complexity `O(S)`."] + #[doc = "- One event."] + #[doc = "- I/O: 1 read `O(S)`, one remove."] + #[doc = "- Storage: removes one item."] cancel_as_multi { threshold: ::core::primitive::u16, other_signatories: ::std::vec::Vec<::subxt::utils::AccountId32>, @@ -46287,24 +51411,49 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::place_bid`]."] + #[doc = "Place a bid."] + #[doc = ""] + #[doc = "Origin must be Signed, and account must have at least `amount` in free balance."] + #[doc = ""] + #[doc = "- `amount`: The amount of the bid; these funds will be reserved, and if/when"] + #[doc = " consolidated, removed. Must be at least `MinBid`."] + #[doc = "- `duration`: The number of periods before which the newly consolidated bid may be"] + #[doc = " thawed. Must be greater than 1 and no more than `QueueCount`."] + #[doc = ""] + #[doc = "Complexities:"] + #[doc = "- `Queues[duration].len()` (just take max)."] place_bid { #[codec(compact)] amount: ::core::primitive::u128, duration: ::core::primitive::u32, }, #[codec(index = 1)] - #[doc = "See [`Pallet::retract_bid`]."] + #[doc = "Retract a previously placed bid."] + #[doc = ""] + #[doc = "Origin must be Signed, and the account should have previously issued a still-active bid"] + #[doc = "of `amount` for `duration`."] + #[doc = ""] + #[doc = "- `amount`: The amount of the previous bid."] + #[doc = "- `duration`: The duration of the previous bid."] retract_bid { #[codec(compact)] amount: ::core::primitive::u128, duration: ::core::primitive::u32, }, #[codec(index = 2)] - #[doc = "See [`Pallet::fund_deficit`]."] + #[doc = "Ensure we have sufficient funding for all potential payouts."] + #[doc = ""] + #[doc = "- `origin`: Must be accepted by `FundOrigin`."] fund_deficit, #[codec(index = 3)] - #[doc = "See [`Pallet::thaw_private`]."] + #[doc = "Reduce or remove an outstanding receipt, placing the according proportion of funds into"] + #[doc = "the account of the owner."] + #[doc = ""] + #[doc = "- `origin`: Must be Signed and the account must be the owner of the receipt `index` as"] + #[doc = " well as any fungible counterpart."] + #[doc = "- `index`: The index of the receipt."] + #[doc = "- `portion`: If `Some`, then only the given portion of the receipt should be thawed. If"] + #[doc = " `None`, then all of it should be."] thaw_private { #[codec(compact)] index: ::core::primitive::u32, @@ -46313,19 +51462,24 @@ pub mod api { >, }, #[codec(index = 4)] - #[doc = "See [`Pallet::thaw_communal`]."] + #[doc = "Reduce or remove an outstanding receipt, placing the according proportion of funds into"] + #[doc = "the account of the owner."] + #[doc = ""] + #[doc = "- `origin`: Must be Signed and the account must be the owner of the fungible counterpart"] + #[doc = " for receipt `index`."] + #[doc = "- `index`: The index of the receipt."] thaw_communal { #[codec(compact)] index: ::core::primitive::u32, }, #[codec(index = 5)] - #[doc = "See [`Pallet::communify`]."] + #[doc = "Make a private receipt communal and create fungible counterparts for its owner."] communify { #[codec(compact)] index: ::core::primitive::u32, }, #[codec(index = 6)] - #[doc = "See [`Pallet::privatize`]."] + #[doc = "Make a communal receipt private and burn fungible counterparts from its owner."] privatize { #[codec(compact)] index: ::core::primitive::u32, @@ -46544,21 +51698,36 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::note_preimage`]."] + #[doc = "Register a preimage on-chain."] + #[doc = ""] + #[doc = "If the preimage was previously requested, no fees or deposits are taken for providing"] + #[doc = "the preimage. Otherwise, a deposit is taken proportional to the size of the preimage."] note_preimage { bytes: ::std::vec::Vec<::core::primitive::u8>, }, #[codec(index = 1)] - #[doc = "See [`Pallet::unnote_preimage`]."] + #[doc = "Clear an unrequested preimage from the runtime storage."] + #[doc = ""] + #[doc = "If `len` is provided, then it will be a much cheaper operation."] + #[doc = ""] + #[doc = "- `hash`: The hash of the preimage to be removed from the store."] + #[doc = "- `len`: The length of the preimage of `hash`."] unnote_preimage { hash: ::subxt::utils::H256 }, #[codec(index = 2)] - #[doc = "See [`Pallet::request_preimage`]."] + #[doc = "Request a preimage be uploaded to the chain without paying any fees or deposits."] + #[doc = ""] + #[doc = "If the preimage requests has already been provided on-chain, we unreserve any deposit"] + #[doc = "a user may have paid, and take the control of the preimage out of their hands."] request_preimage { hash: ::subxt::utils::H256 }, #[codec(index = 3)] - #[doc = "See [`Pallet::unrequest_preimage`]."] + #[doc = "Clear a previously made request for a preimage."] + #[doc = ""] + #[doc = "NOTE: THIS MUST NOT BE CALLED ON `hash` MORE TIMES THAN `request_preimage`."] unrequest_preimage { hash: ::subxt::utils::H256 }, #[codec(index = 4)] - #[doc = "See [`Pallet::ensure_updated`]."] + #[doc = "Ensure that the a bulk of pre-images is upgraded."] + #[doc = ""] + #[doc = "The caller pays no fee if at least 90% of pre-images were successfully updated."] ensure_updated { hashes: ::std::vec::Vec<::subxt::utils::H256>, }, @@ -46701,7 +51870,15 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::proxy`]."] + #[doc = "Dispatch the given `call` from an account that the sender is authorised for through"] + #[doc = "`add_proxy`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `real`: The account that the proxy will make a call on behalf of."] + #[doc = "- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call."] + #[doc = "- `call`: The call to be made by the `real` account."] proxy { real: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, force_proxy_type: @@ -46709,31 +51886,82 @@ pub mod api { call: ::std::boxed::Box, }, #[codec(index = 1)] - #[doc = "See [`Pallet::add_proxy`]."] + #[doc = "Register a proxy account for the sender that is able to make calls on its behalf."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `proxy`: The account that the `caller` would like to make a proxy."] + #[doc = "- `proxy_type`: The permissions allowed for this proxy account."] + #[doc = "- `delay`: The announcement period required of the initial proxy. Will generally be"] + #[doc = "zero."] add_proxy { delegate: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, proxy_type: runtime_types::rococo_runtime::ProxyType, delay: ::core::primitive::u32, }, #[codec(index = 2)] - #[doc = "See [`Pallet::remove_proxy`]."] + #[doc = "Unregister a proxy account for the sender."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `proxy`: The account that the `caller` would like to remove as a proxy."] + #[doc = "- `proxy_type`: The permissions currently enabled for the removed proxy account."] remove_proxy { delegate: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, proxy_type: runtime_types::rococo_runtime::ProxyType, delay: ::core::primitive::u32, }, #[codec(index = 3)] - #[doc = "See [`Pallet::remove_proxies`]."] + #[doc = "Unregister all proxy accounts for the sender."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "WARNING: This may be called on accounts created by `pure`, however if done, then"] + #[doc = "the unreserved fees will be inaccessible. **All access to this account will be lost.**"] remove_proxies, #[codec(index = 4)] - #[doc = "See [`Pallet::create_pure`]."] + #[doc = "Spawn a fresh new account that is guaranteed to be otherwise inaccessible, and"] + #[doc = "initialize it with a proxy of `proxy_type` for `origin` sender."] + #[doc = ""] + #[doc = "Requires a `Signed` origin."] + #[doc = ""] + #[doc = "- `proxy_type`: The type of the proxy that the sender will be registered as over the"] + #[doc = "new account. This will almost always be the most permissive `ProxyType` possible to"] + #[doc = "allow for maximum flexibility."] + #[doc = "- `index`: A disambiguation index, in case this is called multiple times in the same"] + #[doc = "transaction (e.g. with `utility::batch`). Unless you're using `batch` you probably just"] + #[doc = "want to use `0`."] + #[doc = "- `delay`: The announcement period required of the initial proxy. Will generally be"] + #[doc = "zero."] + #[doc = ""] + #[doc = "Fails with `Duplicate` if this has already been called in this transaction, from the"] + #[doc = "same sender, with the same parameters."] + #[doc = ""] + #[doc = "Fails if there are insufficient funds to pay for deposit."] create_pure { proxy_type: runtime_types::rococo_runtime::ProxyType, delay: ::core::primitive::u32, index: ::core::primitive::u16, }, #[codec(index = 5)] - #[doc = "See [`Pallet::kill_pure`]."] + #[doc = "Removes a previously spawned pure proxy."] + #[doc = ""] + #[doc = "WARNING: **All access to this account will be lost.** Any funds held in it will be"] + #[doc = "inaccessible."] + #[doc = ""] + #[doc = "Requires a `Signed` origin, and the sender account must have been created by a call to"] + #[doc = "`pure` with corresponding parameters."] + #[doc = ""] + #[doc = "- `spawner`: The account that originally called `pure` to create this account."] + #[doc = "- `index`: The disambiguation index originally passed to `pure`. Probably `0`."] + #[doc = "- `proxy_type`: The proxy type originally passed to `pure`."] + #[doc = "- `height`: The height of the chain when the call to `pure` was processed."] + #[doc = "- `ext_index`: The extrinsic index in which the call to `pure` was processed."] + #[doc = ""] + #[doc = "Fails with `NoPermission` in case the caller is not a previously created pure"] + #[doc = "account whose `pure` call has corresponding parameters."] kill_pure { spawner: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, proxy_type: runtime_types::rococo_runtime::ProxyType, @@ -46744,25 +51972,67 @@ pub mod api { ext_index: ::core::primitive::u32, }, #[codec(index = 6)] - #[doc = "See [`Pallet::announce`]."] + #[doc = "Publish the hash of a proxy-call that will be made in the future."] + #[doc = ""] + #[doc = "This must be called some number of blocks before the corresponding `proxy` is attempted"] + #[doc = "if the delay associated with the proxy relationship is greater than zero."] + #[doc = ""] + #[doc = "No more than `MaxPending` announcements may be made at any one time."] + #[doc = ""] + #[doc = "This will take a deposit of `AnnouncementDepositFactor` as well as"] + #[doc = "`AnnouncementDepositBase` if there are no other pending announcements."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a proxy of `real`."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `real`: The account that the proxy will make a call on behalf of."] + #[doc = "- `call_hash`: The hash of the call to be made by the `real` account."] announce { real: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, call_hash: ::subxt::utils::H256, }, #[codec(index = 7)] - #[doc = "See [`Pallet::remove_announcement`]."] + #[doc = "Remove a given announcement."] + #[doc = ""] + #[doc = "May be called by a proxy account to remove a call they previously announced and return"] + #[doc = "the deposit."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `real`: The account that the proxy will make a call on behalf of."] + #[doc = "- `call_hash`: The hash of the call to be made by the `real` account."] remove_announcement { real: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, call_hash: ::subxt::utils::H256, }, #[codec(index = 8)] - #[doc = "See [`Pallet::reject_announcement`]."] + #[doc = "Remove the given announcement of a delegate."] + #[doc = ""] + #[doc = "May be called by a target (proxied) account to remove a call that one of their delegates"] + #[doc = "(`delegate`) has announced they want to execute. The deposit is returned."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `delegate`: The account that previously announced the call."] + #[doc = "- `call_hash`: The hash of the call to be made."] reject_announcement { delegate: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, call_hash: ::subxt::utils::H256, }, #[codec(index = 9)] - #[doc = "See [`Pallet::proxy_announced`]."] + #[doc = "Dispatch the given `call` from an account that the sender is authorized for through"] + #[doc = "`add_proxy`."] + #[doc = ""] + #[doc = "Removes any corresponding announcement(s)."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `real`: The account that the proxy will make a call on behalf of."] + #[doc = "- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call."] + #[doc = "- `call`: The call to be made by the `real` account."] proxy_announced { delegate: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, real: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, @@ -46908,40 +52178,85 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::add_member`]."] + #[doc = "Introduce a new member."] + #[doc = ""] + #[doc = "- `origin`: Must be the `AddOrigin`."] + #[doc = "- `who`: Account of non-member which will become a member."] + #[doc = ""] + #[doc = "Weight: `O(1)`"] add_member { who: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 1)] - #[doc = "See [`Pallet::promote_member`]."] + #[doc = "Increment the rank of an existing member by one."] + #[doc = ""] + #[doc = "- `origin`: Must be the `PromoteOrigin`."] + #[doc = "- `who`: Account of existing member."] + #[doc = ""] + #[doc = "Weight: `O(1)`"] promote_member { who: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 2)] - #[doc = "See [`Pallet::demote_member`]."] + #[doc = "Decrement the rank of an existing member by one. If the member is already at rank zero,"] + #[doc = "then they are removed entirely."] + #[doc = ""] + #[doc = "- `origin`: Must be the `DemoteOrigin`."] + #[doc = "- `who`: Account of existing member of rank greater than zero."] + #[doc = ""] + #[doc = "Weight: `O(1)`, less if the member's index is highest in its rank."] demote_member { who: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 3)] - #[doc = "See [`Pallet::remove_member`]."] + #[doc = "Remove the member entirely."] + #[doc = ""] + #[doc = "- `origin`: Must be the `RemoveOrigin`."] + #[doc = "- `who`: Account of existing member of rank greater than zero."] + #[doc = "- `min_rank`: The rank of the member or greater."] + #[doc = ""] + #[doc = "Weight: `O(min_rank)`."] remove_member { who: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, min_rank: ::core::primitive::u16, }, #[codec(index = 4)] - #[doc = "See [`Pallet::vote`]."] + #[doc = "Add an aye or nay vote for the sender to the given proposal."] + #[doc = ""] + #[doc = "- `origin`: Must be `Signed` by a member account."] + #[doc = "- `poll`: Index of a poll which is ongoing."] + #[doc = "- `aye`: `true` if the vote is to approve the proposal, `false` otherwise."] + #[doc = ""] + #[doc = "Transaction fees are be waived if the member is voting on any particular proposal"] + #[doc = "for the first time and the call is successful. Subsequent vote changes will charge a"] + #[doc = "fee."] + #[doc = ""] + #[doc = "Weight: `O(1)`, less if there was no previous vote on the poll by the member."] vote { poll: ::core::primitive::u32, aye: ::core::primitive::bool, }, #[codec(index = 5)] - #[doc = "See [`Pallet::cleanup_poll`]."] + #[doc = "Remove votes from the given poll. It must have ended."] + #[doc = ""] + #[doc = "- `origin`: Must be `Signed` by any account."] + #[doc = "- `poll_index`: Index of a poll which is completed and for which votes continue to"] + #[doc = " exist."] + #[doc = "- `max`: Maximum number of vote items from remove in this call."] + #[doc = ""] + #[doc = "Transaction fees are waived if the operation is successful."] + #[doc = ""] + #[doc = "Weight `O(max)` (less if there are fewer items to remove than `max`)."] cleanup_poll { poll_index: ::core::primitive::u32, max: ::core::primitive::u32, }, #[codec(index = 6)] - #[doc = "See [`Pallet::exchange_member`]."] + #[doc = "Exchanges a member with a new account and the same existing rank."] + #[doc = ""] + #[doc = "- `origin`: Must be the `ExchangeOrigin`."] + #[doc = "- `who`: Account of existing member of rank greater than zero to be exchanged."] + #[doc = "- `new_who`: New Account of existing member of rank greater than zero to exchanged to."] exchange_member { who: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, new_who: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, @@ -47097,50 +52412,134 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::as_recovered`]."] + #[doc = "Send a call through a recovered account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and registered to"] + #[doc = "be able to make calls on behalf of the recovered account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `account`: The recovered account you want to make a call on-behalf-of."] + #[doc = "- `call`: The call you want to make with the recovered account."] as_recovered { account: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, call: ::std::boxed::Box, }, #[codec(index = 1)] - #[doc = "See [`Pallet::set_recovered`]."] + #[doc = "Allow ROOT to bypass the recovery process and set an a rescuer account"] + #[doc = "for a lost account directly."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _ROOT_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `lost`: The \"lost account\" to be recovered."] + #[doc = "- `rescuer`: The \"rescuer account\" which can call as the lost account."] set_recovered { lost: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, rescuer: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 2)] - #[doc = "See [`Pallet::create_recovery`]."] + #[doc = "Create a recovery configuration for your account. This makes your account recoverable."] + #[doc = ""] + #[doc = "Payment: `ConfigDepositBase` + `FriendDepositFactor` * #_of_friends balance"] + #[doc = "will be reserved for storing the recovery configuration. This deposit is returned"] + #[doc = "in full when the user calls `remove_recovery`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `friends`: A list of friends you trust to vouch for recovery attempts. Should be"] + #[doc = " ordered and contain no duplicate values."] + #[doc = "- `threshold`: The number of friends that must vouch for a recovery attempt before the"] + #[doc = " account can be recovered. Should be less than or equal to the length of the list of"] + #[doc = " friends."] + #[doc = "- `delay_period`: The number of blocks after a recovery attempt is initialized that"] + #[doc = " needs to pass before the account can be recovered."] create_recovery { friends: ::std::vec::Vec<::subxt::utils::AccountId32>, threshold: ::core::primitive::u16, delay_period: ::core::primitive::u32, }, #[codec(index = 3)] - #[doc = "See [`Pallet::initiate_recovery`]."] + #[doc = "Initiate the process for recovering a recoverable account."] + #[doc = ""] + #[doc = "Payment: `RecoveryDeposit` balance will be reserved for initiating the"] + #[doc = "recovery process. This deposit will always be repatriated to the account"] + #[doc = "trying to be recovered. See `close_recovery`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `account`: The lost account that you want to recover. This account needs to be"] + #[doc = " recoverable (i.e. have a recovery configuration)."] initiate_recovery { account: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 4)] - #[doc = "See [`Pallet::vouch_recovery`]."] + #[doc = "Allow a \"friend\" of a recoverable account to vouch for an active recovery"] + #[doc = "process for that account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and must be a \"friend\""] + #[doc = "for the recoverable account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `lost`: The lost account that you want to recover."] + #[doc = "- `rescuer`: The account trying to rescue the lost account that you want to vouch for."] + #[doc = ""] + #[doc = "The combination of these two parameters must point to an active recovery"] + #[doc = "process."] vouch_recovery { lost: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, rescuer: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 5)] - #[doc = "See [`Pallet::claim_recovery`]."] + #[doc = "Allow a successful rescuer to claim their recovered account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and must be a \"rescuer\""] + #[doc = "who has successfully completed the account recovery process: collected"] + #[doc = "`threshold` or more vouches, waited `delay_period` blocks since initiation."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `account`: The lost account that you want to claim has been successfully recovered by"] + #[doc = " you."] claim_recovery { account: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 6)] - #[doc = "See [`Pallet::close_recovery`]."] + #[doc = "As the controller of a recoverable account, close an active recovery"] + #[doc = "process for your account."] + #[doc = ""] + #[doc = "Payment: By calling this function, the recoverable account will receive"] + #[doc = "the recovery deposit `RecoveryDeposit` placed by the rescuer."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and must be a"] + #[doc = "recoverable account with an active recovery process for it."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `rescuer`: The account trying to rescue this recoverable account."] close_recovery { rescuer: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 7)] - #[doc = "See [`Pallet::remove_recovery`]."] + #[doc = "Remove the recovery process for your account. Recovered accounts are still accessible."] + #[doc = ""] + #[doc = "NOTE: The user must make sure to call `close_recovery` on all active"] + #[doc = "recovery attempts before calling this function else it will fail."] + #[doc = ""] + #[doc = "Payment: By calling this function the recoverable account will unreserve"] + #[doc = "their recovery configuration deposit."] + #[doc = "(`ConfigDepositBase` + `FriendDepositFactor` * #_of_friends)"] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and must be a"] + #[doc = "recoverable account (i.e. has a recovery configuration)."] remove_recovery, #[codec(index = 8)] - #[doc = "See [`Pallet::cancel_recovered`]."] + #[doc = "Cancel the ability to use `as_recovered` for `account`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and registered to"] + #[doc = "be able to make calls on behalf of the recovered account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `account`: The recovered account you are able to call on-behalf-of."] cancel_recovered { account: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, @@ -47304,7 +52703,15 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::submit`]."] + #[doc = "Propose a referendum on a privileged action."] + #[doc = ""] + #[doc = "- `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds"] + #[doc = " available."] + #[doc = "- `proposal_origin`: The origin from which the proposal should be executed."] + #[doc = "- `proposal`: The proposal."] + #[doc = "- `enactment_moment`: The moment that the proposal should be enacted."] + #[doc = ""] + #[doc = "Emits `Submitted`."] submit { proposal_origin: ::std::boxed::Box, @@ -47318,28 +52725,74 @@ pub mod api { >, }, #[codec(index = 1)] - #[doc = "See [`Pallet::place_decision_deposit`]."] + #[doc = "Post the Decision Deposit for a referendum."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` and the account must have funds available for the"] + #[doc = " referendum's track's Decision Deposit."] + #[doc = "- `index`: The index of the submitted referendum whose Decision Deposit is yet to be"] + #[doc = " posted."] + #[doc = ""] + #[doc = "Emits `DecisionDepositPlaced`."] place_decision_deposit { index: ::core::primitive::u32 }, #[codec(index = 2)] - #[doc = "See [`Pallet::refund_decision_deposit`]."] + #[doc = "Refund the Decision Deposit for a closed referendum back to the depositor."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` or `Root`."] + #[doc = "- `index`: The index of a closed referendum whose Decision Deposit has not yet been"] + #[doc = " refunded."] + #[doc = ""] + #[doc = "Emits `DecisionDepositRefunded`."] refund_decision_deposit { index: ::core::primitive::u32 }, #[codec(index = 3)] - #[doc = "See [`Pallet::cancel`]."] + #[doc = "Cancel an ongoing referendum."] + #[doc = ""] + #[doc = "- `origin`: must be the `CancelOrigin`."] + #[doc = "- `index`: The index of the referendum to be cancelled."] + #[doc = ""] + #[doc = "Emits `Cancelled`."] cancel { index: ::core::primitive::u32 }, #[codec(index = 4)] - #[doc = "See [`Pallet::kill`]."] + #[doc = "Cancel an ongoing referendum and slash the deposits."] + #[doc = ""] + #[doc = "- `origin`: must be the `KillOrigin`."] + #[doc = "- `index`: The index of the referendum to be cancelled."] + #[doc = ""] + #[doc = "Emits `Killed` and `DepositSlashed`."] kill { index: ::core::primitive::u32 }, #[codec(index = 5)] - #[doc = "See [`Pallet::nudge_referendum`]."] + #[doc = "Advance a referendum onto its next logical state. Only used internally."] + #[doc = ""] + #[doc = "- `origin`: must be `Root`."] + #[doc = "- `index`: the referendum to be advanced."] nudge_referendum { index: ::core::primitive::u32 }, #[codec(index = 6)] - #[doc = "See [`Pallet::one_fewer_deciding`]."] + #[doc = "Advance a track onto its next logical state. Only used internally."] + #[doc = ""] + #[doc = "- `origin`: must be `Root`."] + #[doc = "- `track`: the track to be advanced."] + #[doc = ""] + #[doc = "Action item for when there is now one fewer referendum in the deciding phase and the"] + #[doc = "`DecidingCount` is not yet updated. This means that we should either:"] + #[doc = "- begin deciding another referendum (and leave `DecidingCount` alone); or"] + #[doc = "- decrement `DecidingCount`."] one_fewer_deciding { track: ::core::primitive::u16 }, #[codec(index = 7)] - #[doc = "See [`Pallet::refund_submission_deposit`]."] + #[doc = "Refund the Submission Deposit for a closed referendum back to the depositor."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` or `Root`."] + #[doc = "- `index`: The index of a closed referendum whose Submission Deposit has not yet been"] + #[doc = " refunded."] + #[doc = ""] + #[doc = "Emits `SubmissionDepositRefunded`."] refund_submission_deposit { index: ::core::primitive::u32 }, #[codec(index = 8)] - #[doc = "See [`Pallet::set_metadata`]."] + #[doc = "Set or clear metadata of a referendum."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a"] + #[doc = " metadata of a finished referendum."] + #[doc = "- `index`: The index of a referendum to set or clear metadata for."] + #[doc = "- `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata."] set_metadata { index: ::core::primitive::u32, maybe_hash: ::core::option::Option<::subxt::utils::H256>, @@ -47358,7 +52811,15 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call2 { #[codec(index = 0)] - #[doc = "See [`Pallet::submit`]."] + #[doc = "Propose a referendum on a privileged action."] + #[doc = ""] + #[doc = "- `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds"] + #[doc = " available."] + #[doc = "- `proposal_origin`: The origin from which the proposal should be executed."] + #[doc = "- `proposal`: The proposal."] + #[doc = "- `enactment_moment`: The moment that the proposal should be enacted."] + #[doc = ""] + #[doc = "Emits `Submitted`."] submit { proposal_origin: ::std::boxed::Box, @@ -47372,28 +52833,74 @@ pub mod api { >, }, #[codec(index = 1)] - #[doc = "See [`Pallet::place_decision_deposit`]."] + #[doc = "Post the Decision Deposit for a referendum."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` and the account must have funds available for the"] + #[doc = " referendum's track's Decision Deposit."] + #[doc = "- `index`: The index of the submitted referendum whose Decision Deposit is yet to be"] + #[doc = " posted."] + #[doc = ""] + #[doc = "Emits `DecisionDepositPlaced`."] place_decision_deposit { index: ::core::primitive::u32 }, #[codec(index = 2)] - #[doc = "See [`Pallet::refund_decision_deposit`]."] + #[doc = "Refund the Decision Deposit for a closed referendum back to the depositor."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` or `Root`."] + #[doc = "- `index`: The index of a closed referendum whose Decision Deposit has not yet been"] + #[doc = " refunded."] + #[doc = ""] + #[doc = "Emits `DecisionDepositRefunded`."] refund_decision_deposit { index: ::core::primitive::u32 }, #[codec(index = 3)] - #[doc = "See [`Pallet::cancel`]."] + #[doc = "Cancel an ongoing referendum."] + #[doc = ""] + #[doc = "- `origin`: must be the `CancelOrigin`."] + #[doc = "- `index`: The index of the referendum to be cancelled."] + #[doc = ""] + #[doc = "Emits `Cancelled`."] cancel { index: ::core::primitive::u32 }, #[codec(index = 4)] - #[doc = "See [`Pallet::kill`]."] + #[doc = "Cancel an ongoing referendum and slash the deposits."] + #[doc = ""] + #[doc = "- `origin`: must be the `KillOrigin`."] + #[doc = "- `index`: The index of the referendum to be cancelled."] + #[doc = ""] + #[doc = "Emits `Killed` and `DepositSlashed`."] kill { index: ::core::primitive::u32 }, #[codec(index = 5)] - #[doc = "See [`Pallet::nudge_referendum`]."] + #[doc = "Advance a referendum onto its next logical state. Only used internally."] + #[doc = ""] + #[doc = "- `origin`: must be `Root`."] + #[doc = "- `index`: the referendum to be advanced."] nudge_referendum { index: ::core::primitive::u32 }, #[codec(index = 6)] - #[doc = "See [`Pallet::one_fewer_deciding`]."] + #[doc = "Advance a track onto its next logical state. Only used internally."] + #[doc = ""] + #[doc = "- `origin`: must be `Root`."] + #[doc = "- `track`: the track to be advanced."] + #[doc = ""] + #[doc = "Action item for when there is now one fewer referendum in the deciding phase and the"] + #[doc = "`DecidingCount` is not yet updated. This means that we should either:"] + #[doc = "- begin deciding another referendum (and leave `DecidingCount` alone); or"] + #[doc = "- decrement `DecidingCount`."] one_fewer_deciding { track: ::core::primitive::u16 }, #[codec(index = 7)] - #[doc = "See [`Pallet::refund_submission_deposit`]."] + #[doc = "Refund the Submission Deposit for a closed referendum back to the depositor."] + #[doc = ""] + #[doc = "- `origin`: must be `Signed` or `Root`."] + #[doc = "- `index`: The index of a closed referendum whose Submission Deposit has not yet been"] + #[doc = " refunded."] + #[doc = ""] + #[doc = "Emits `SubmissionDepositRefunded`."] refund_submission_deposit { index: ::core::primitive::u32 }, #[codec(index = 8)] - #[doc = "See [`Pallet::set_metadata`]."] + #[doc = "Set or clear metadata of a referendum."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a"] + #[doc = " metadata of a finished referendum."] + #[doc = "- `index`: The index of a referendum to set or clear metadata for."] + #[doc = "- `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata."] set_metadata { index: ::core::primitive::u32, maybe_hash: ::core::option::Option<::subxt::utils::H256>, @@ -47931,12 +53438,11 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See `Pallet::fill_block`."] + #[doc = "A dispatch that will fill the block weight up to the given ratio."] fill_block { ratio: runtime_types::sp_arithmetic::per_things::Perbill, }, #[codec(index = 1)] - #[doc = "See `Pallet::trigger_defensive`."] trigger_defensive, } #[derive( @@ -47974,7 +53480,7 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::schedule`]."] + #[doc = "Anonymously schedule a task."] schedule { when: ::core::primitive::u32, maybe_periodic: ::core::option::Option<( @@ -47985,13 +53491,13 @@ pub mod api { call: ::std::boxed::Box, }, #[codec(index = 1)] - #[doc = "See [`Pallet::cancel`]."] + #[doc = "Cancel an anonymously scheduled task."] cancel { when: ::core::primitive::u32, index: ::core::primitive::u32, }, #[codec(index = 2)] - #[doc = "See [`Pallet::schedule_named`]."] + #[doc = "Schedule a named task."] schedule_named { id: [::core::primitive::u8; 32usize], when: ::core::primitive::u32, @@ -48003,12 +53509,12 @@ pub mod api { call: ::std::boxed::Box, }, #[codec(index = 3)] - #[doc = "See [`Pallet::cancel_named`]."] + #[doc = "Cancel a named scheduled task."] cancel_named { id: [::core::primitive::u8; 32usize], }, #[codec(index = 4)] - #[doc = "See [`Pallet::schedule_after`]."] + #[doc = "Anonymously schedule a task after a delay."] schedule_after { after: ::core::primitive::u32, maybe_periodic: ::core::option::Option<( @@ -48019,7 +53525,7 @@ pub mod api { call: ::std::boxed::Box, }, #[codec(index = 5)] - #[doc = "See [`Pallet::schedule_named_after`]."] + #[doc = "Schedule a named task after a delay."] schedule_named_after { id: [::core::primitive::u8; 32usize], after: ::core::primitive::u32, @@ -48031,26 +53537,48 @@ pub mod api { call: ::std::boxed::Box, }, #[codec(index = 6)] - #[doc = "See [`Pallet::set_retry`]."] + #[doc = "Set a retry configuration for a task so that, in case its scheduled run fails, it will"] + #[doc = "be retried after `period` blocks, for a total amount of `retries` retries or until it"] + #[doc = "succeeds."] + #[doc = ""] + #[doc = "Tasks which need to be scheduled for a retry are still subject to weight metering and"] + #[doc = "agenda space, same as a regular task. If a periodic task fails, it will be scheduled"] + #[doc = "normally while the task is retrying."] + #[doc = ""] + #[doc = "Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic"] + #[doc = "clones of the original task. Their retry configuration will be derived from the"] + #[doc = "original task's configuration, but will have a lower value for `remaining` than the"] + #[doc = "original `total_retries`."] set_retry { task: (::core::primitive::u32, ::core::primitive::u32), retries: ::core::primitive::u8, period: ::core::primitive::u32, }, #[codec(index = 7)] - #[doc = "See [`Pallet::set_retry_named`]."] + #[doc = "Set a retry configuration for a named task so that, in case its scheduled run fails, it"] + #[doc = "will be retried after `period` blocks, for a total amount of `retries` retries or until"] + #[doc = "it succeeds."] + #[doc = ""] + #[doc = "Tasks which need to be scheduled for a retry are still subject to weight metering and"] + #[doc = "agenda space, same as a regular task. If a periodic task fails, it will be scheduled"] + #[doc = "normally while the task is retrying."] + #[doc = ""] + #[doc = "Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic"] + #[doc = "clones of the original task. Their retry configuration will be derived from the"] + #[doc = "original task's configuration, but will have a lower value for `remaining` than the"] + #[doc = "original `total_retries`."] set_retry_named { id: [::core::primitive::u8; 32usize], retries: ::core::primitive::u8, period: ::core::primitive::u32, }, #[codec(index = 8)] - #[doc = "See [`Pallet::cancel_retry`]."] + #[doc = "Removes the retry configuration of a task."] cancel_retry { task: (::core::primitive::u32, ::core::primitive::u32), }, #[codec(index = 9)] - #[doc = "See [`Pallet::cancel_retry_named`]."] + #[doc = "Cancel the retry configuration of a named task."] cancel_retry_named { id: [::core::primitive::u8; 32usize], }, @@ -48208,13 +53736,32 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::set_keys`]."] + #[doc = "Sets the session key(s) of the function caller to `keys`."] + #[doc = "Allows an account to set its session key prior to becoming a validator."] + #[doc = "This doesn't take effect until the next session."] + #[doc = ""] + #[doc = "The dispatch origin of this function must be signed."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`. Actual cost depends on the number of length of `T::Keys::key_ids()` which is"] + #[doc = " fixed."] set_keys { keys: runtime_types::rococo_runtime::SessionKeys, proof: ::std::vec::Vec<::core::primitive::u8>, }, #[codec(index = 1)] - #[doc = "See [`Pallet::purge_keys`]."] + #[doc = "Removes any session key(s) of the function caller."] + #[doc = ""] + #[doc = "This doesn't take effect until the next session."] + #[doc = ""] + #[doc = "The dispatch origin of this function must be Signed and the account must be either be"] + #[doc = "convertible to a validator ID using the chain's typical addressing system (this usually"] + #[doc = "means being a controller account) or directly convertible into a validator ID (which"] + #[doc = "usually means being a stash account)."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)` in number of key types. Actual cost depends on the number of length of"] + #[doc = " `T::Keys::key_ids()` which is fixed."] purge_keys, } #[derive( @@ -48283,38 +53830,113 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::bid`]."] + #[doc = "A user outside of the society can make a bid for entry."] + #[doc = ""] + #[doc = "Payment: The group's Candidate Deposit will be reserved for making a bid. It is returned"] + #[doc = "when the bid becomes a member, or if the bid calls `unbid`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `value`: A one time payment the bid would like to receive when joining the society."] bid { value: ::core::primitive::u128 }, #[codec(index = 1)] - #[doc = "See [`Pallet::unbid`]."] + #[doc = "A bidder can remove their bid for entry into society."] + #[doc = "By doing so, they will have their candidate deposit returned or"] + #[doc = "they will unvouch their voucher."] + #[doc = ""] + #[doc = "Payment: The bid deposit is unreserved if the user made a bid."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a bidder."] unbid, #[codec(index = 2)] - #[doc = "See [`Pallet::vouch`]."] + #[doc = "As a member, vouch for someone to join society by placing a bid on their behalf."] + #[doc = ""] + #[doc = "There is no deposit required to vouch for a new bid, but a member can only vouch for"] + #[doc = "one bid at a time. If the bid becomes a suspended candidate and ultimately rejected by"] + #[doc = "the suspension judgement origin, the member will be banned from vouching again."] + #[doc = ""] + #[doc = "As a vouching member, you can claim a tip if the candidate is accepted. This tip will"] + #[doc = "be paid as a portion of the reward the member will receive for joining the society."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a member."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `who`: The user who you would like to vouch for."] + #[doc = "- `value`: The total reward to be paid between you and the candidate if they become"] + #[doc = "a member in the society."] + #[doc = "- `tip`: Your cut of the total `value` payout when the candidate is inducted into"] + #[doc = "the society. Tips larger than `value` will be saturated upon payout."] vouch { who: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, value: ::core::primitive::u128, tip: ::core::primitive::u128, }, #[codec(index = 3)] - #[doc = "See [`Pallet::unvouch`]."] + #[doc = "As a vouching member, unvouch a bid. This only works while vouched user is"] + #[doc = "only a bidder (and not a candidate)."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a vouching member."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `pos`: Position in the `Bids` vector of the bid who should be unvouched."] unvouch, #[codec(index = 4)] - #[doc = "See [`Pallet::vote`]."] + #[doc = "As a member, vote on a candidate."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a member."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `candidate`: The candidate that the member would like to bid on."] + #[doc = "- `approve`: A boolean which says if the candidate should be approved (`true`) or"] + #[doc = " rejected (`false`)."] vote { candidate: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, approve: ::core::primitive::bool, }, #[codec(index = 5)] - #[doc = "See [`Pallet::defender_vote`]."] + #[doc = "As a member, vote on the defender."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a member."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `approve`: A boolean which says if the candidate should be"] + #[doc = "approved (`true`) or rejected (`false`)."] defender_vote { approve: ::core::primitive::bool }, #[codec(index = 6)] - #[doc = "See [`Pallet::payout`]."] + #[doc = "Transfer the first matured payout for the sender and remove it from the records."] + #[doc = ""] + #[doc = "NOTE: This extrinsic needs to be called multiple times to claim multiple matured"] + #[doc = "payouts."] + #[doc = ""] + #[doc = "Payment: The member will receive a payment equal to their first matured"] + #[doc = "payout to their free balance."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and a member with"] + #[doc = "payouts remaining."] payout, #[codec(index = 7)] - #[doc = "See [`Pallet::waive_repay`]."] + #[doc = "Repay the payment previously given to the member with the signed origin, remove any"] + #[doc = "pending payments, and elevate them from rank 0 to rank 1."] waive_repay { amount: ::core::primitive::u128 }, #[codec(index = 8)] - #[doc = "See [`Pallet::found_society`]."] + #[doc = "Found the society."] + #[doc = ""] + #[doc = "This is done as a discrete action in order to allow for the"] + #[doc = "pallet to be included into a running chain and can only be done once."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be from the _FounderSetOrigin_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `founder` - The first member and head of the newly founded society."] + #[doc = "- `max_members` - The initial max number of members for the society."] + #[doc = "- `max_intake` - The maximum number of candidates per intake period."] + #[doc = "- `max_strikes`: The maximum number of strikes a member may get before they become"] + #[doc = " suspended and may only be reinstated by the founder."] + #[doc = "- `candidate_deposit`: The deposit required to make a bid for membership of the group."] + #[doc = "- `rules` - The rules of this society concerning membership."] + #[doc = ""] + #[doc = "Complexity: O(1)"] found_society { founder: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, max_members: ::core::primitive::u32, @@ -48324,16 +53946,44 @@ pub mod api { rules: ::std::vec::Vec<::core::primitive::u8>, }, #[codec(index = 9)] - #[doc = "See [`Pallet::dissolve`]."] + #[doc = "Dissolve the society and remove all members."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be Signed, and the signing account must be both"] + #[doc = "the `Founder` and the `Head`. This implies that it may only be done when there is one"] + #[doc = "member."] dissolve, #[codec(index = 10)] - #[doc = "See [`Pallet::judge_suspended_member`]."] + #[doc = "Allow suspension judgement origin to make judgement on a suspended member."] + #[doc = ""] + #[doc = "If a suspended member is forgiven, we simply add them back as a member, not affecting"] + #[doc = "any of the existing storage items for that member."] + #[doc = ""] + #[doc = "If a suspended member is rejected, remove all associated storage items, including"] + #[doc = "their payouts, and remove any vouched bids they currently have."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be Signed from the Founder."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `who` - The suspended member to be judged."] + #[doc = "- `forgive` - A boolean representing whether the suspension judgement origin forgives"] + #[doc = " (`true`) or rejects (`false`) a suspended member."] judge_suspended_member { who: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, forgive: ::core::primitive::bool, }, #[codec(index = 11)] - #[doc = "See [`Pallet::set_parameters`]."] + #[doc = "Change the maximum number of members in society and the maximum number of new candidates"] + #[doc = "in a single intake period."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be Signed by the Founder."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `max_members` - The maximum number of members for the society. This must be no less"] + #[doc = " than the current number of members."] + #[doc = "- `max_intake` - The maximum number of candidates per intake period."] + #[doc = "- `max_strikes`: The maximum number of strikes a member may get before they become"] + #[doc = " suspended and may only be reinstated by the founder."] + #[doc = "- `candidate_deposit`: The deposit required to make a bid for membership of the group."] set_parameters { max_members: ::core::primitive::u32, max_intake: ::core::primitive::u32, @@ -48341,37 +53991,55 @@ pub mod api { candidate_deposit: ::core::primitive::u128, }, #[codec(index = 12)] - #[doc = "See [`Pallet::punish_skeptic`]."] + #[doc = "Punish the skeptic with a strike if they did not vote on a candidate. Callable by the"] + #[doc = "candidate."] punish_skeptic, #[codec(index = 13)] - #[doc = "See [`Pallet::claim_membership`]."] + #[doc = "Transform an approved candidate into a member. Callable only by the"] + #[doc = "the candidate, and only after the period for voting has ended."] claim_membership, #[codec(index = 14)] - #[doc = "See [`Pallet::bestow_membership`]."] + #[doc = "Transform an approved candidate into a member. Callable only by the Signed origin of the"] + #[doc = "Founder, only after the period for voting has ended and only when the candidate is not"] + #[doc = "clearly rejected."] bestow_membership { candidate: ::subxt::utils::AccountId32, }, #[codec(index = 15)] - #[doc = "See [`Pallet::kick_candidate`]."] + #[doc = "Remove the candidate's application from the society. Callable only by the Signed origin"] + #[doc = "of the Founder, only after the period for voting has ended, and only when they do not"] + #[doc = "have a clear approval."] + #[doc = ""] + #[doc = "Any bid deposit is lost and voucher is banned."] kick_candidate { candidate: ::subxt::utils::AccountId32, }, #[codec(index = 16)] - #[doc = "See [`Pallet::resign_candidacy`]."] + #[doc = "Remove the candidate's application from the society. Callable only by the candidate."] + #[doc = ""] + #[doc = "Any bid deposit is lost and voucher is banned."] resign_candidacy, #[codec(index = 17)] - #[doc = "See [`Pallet::drop_candidate`]."] + #[doc = "Remove a `candidate`'s failed application from the society. Callable by any"] + #[doc = "signed origin but only at the end of the subsequent round and only for"] + #[doc = "a candidate with more rejections than approvals."] + #[doc = ""] + #[doc = "The bid deposit is lost and the voucher is banned."] drop_candidate { candidate: ::subxt::utils::AccountId32, }, #[codec(index = 18)] - #[doc = "See [`Pallet::cleanup_candidacy`]."] + #[doc = "Remove up to `max` stale votes for the given `candidate`."] + #[doc = ""] + #[doc = "May be called by any Signed origin, but only after the candidate's candidacy is ended."] cleanup_candidacy { candidate: ::subxt::utils::AccountId32, max: ::core::primitive::u32, }, #[codec(index = 19)] - #[doc = "See [`Pallet::cleanup_challenge`]."] + #[doc = "Remove up to `max` stale votes for the defender in the given `challenge_round`."] + #[doc = ""] + #[doc = "May be called by any Signed origin, but only after the challenge round is ended."] cleanup_challenge { challenge_round: ::core::primitive::u32, max: ::core::primitive::u32, @@ -48762,14 +54430,36 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::control_auto_migration`]."] + #[doc = "Control the automatic migration."] + #[doc = ""] + #[doc = "The dispatch origin of this call must be [`Config::ControlOrigin`]."] control_auto_migration { maybe_config: ::core::option::Option< runtime_types::pallet_state_trie_migration::pallet::MigrationLimits, >, }, #[codec(index = 1)] - #[doc = "See [`Pallet::continue_migrate`]."] + #[doc = "Continue the migration for the given `limits`."] + #[doc = ""] + #[doc = "The dispatch origin of this call can be any signed account."] + #[doc = ""] + #[doc = "This transaction has NO MONETARY INCENTIVES. calling it will not reward anyone. Albeit,"] + #[doc = "Upon successful execution, the transaction fee is returned."] + #[doc = ""] + #[doc = "The (potentially over-estimated) of the byte length of all the data read must be"] + #[doc = "provided for up-front fee-payment and weighing. In essence, the caller is guaranteeing"] + #[doc = "that executing the current `MigrationTask` with the given `limits` will not exceed"] + #[doc = "`real_size_upper` bytes of read data."] + #[doc = ""] + #[doc = "The `witness_task` is merely a helper to prevent the caller from being slashed or"] + #[doc = "generally trigger a migration that they do not intend. This parameter is just a message"] + #[doc = "from caller, saying that they believed `witness_task` was the last state of the"] + #[doc = "migration, and they only wish for their transaction to do anything, if this assumption"] + #[doc = "holds. In case `witness_task` does not match, the transaction fails."] + #[doc = ""] + #[doc = "Based on the documentation of [`MigrationTask::migrate_until_exhaustion`], the"] + #[doc = "recommended way of doing this is to pass a `limit` that only bounds `count`, as the"] + #[doc = "`size` limit can always be overwritten."] continue_migrate { limits: runtime_types::pallet_state_trie_migration::pallet::MigrationLimits, real_size_upper: ::core::primitive::u32, @@ -48777,25 +54467,41 @@ pub mod api { runtime_types::pallet_state_trie_migration::pallet::MigrationTask, }, #[codec(index = 2)] - #[doc = "See [`Pallet::migrate_custom_top`]."] + #[doc = "Migrate the list of top keys by iterating each of them one by one."] + #[doc = ""] + #[doc = "This does not affect the global migration process tracker ([`MigrationProcess`]), and"] + #[doc = "should only be used in case any keys are leftover due to a bug."] migrate_custom_top { keys: ::std::vec::Vec<::std::vec::Vec<::core::primitive::u8>>, witness_size: ::core::primitive::u32, }, #[codec(index = 3)] - #[doc = "See [`Pallet::migrate_custom_child`]."] + #[doc = "Migrate the list of child keys by iterating each of them one by one."] + #[doc = ""] + #[doc = "All of the given child keys must be present under one `child_root`."] + #[doc = ""] + #[doc = "This does not affect the global migration process tracker ([`MigrationProcess`]), and"] + #[doc = "should only be used in case any keys are leftover due to a bug."] migrate_custom_child { root: ::std::vec::Vec<::core::primitive::u8>, child_keys: ::std::vec::Vec<::std::vec::Vec<::core::primitive::u8>>, total_size: ::core::primitive::u32, }, #[codec(index = 4)] - #[doc = "See [`Pallet::set_signed_max_limits`]."] + #[doc = "Set the maximum limit of the signed migration."] set_signed_max_limits { limits: runtime_types::pallet_state_trie_migration::pallet::MigrationLimits, }, #[codec(index = 5)] - #[doc = "See [`Pallet::force_set_progress`]."] + #[doc = "Forcefully set the progress the running migration."] + #[doc = ""] + #[doc = "This is only useful in one case: the next key to migrate is too big to be migrated with"] + #[doc = "a signed account, in a parachain context, and we simply want to skip it. A reasonable"] + #[doc = "example of this would be `:code:`, which is both very expensive to migrate, and commonly"] + #[doc = "used, so probably it is already migrated."] + #[doc = ""] + #[doc = "In case you mess things up, you can also, in principle, use this to reset the migration"] + #[doc = "process."] force_set_progress { progress_top: runtime_types::pallet_state_trie_migration::pallet::Progress, progress_child: @@ -48978,29 +54684,39 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::sudo`]."] + #[doc = "Authenticates the sudo key and dispatches a function call with `Root` origin."] sudo { call: ::std::boxed::Box, }, #[codec(index = 1)] - #[doc = "See [`Pallet::sudo_unchecked_weight`]."] + #[doc = "Authenticates the sudo key and dispatches a function call with `Root` origin."] + #[doc = "This function does not check the weight of the call, and instead allows the"] + #[doc = "Sudo user to specify the weight of the call."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] sudo_unchecked_weight { call: ::std::boxed::Box, weight: runtime_types::sp_weights::weight_v2::Weight, }, #[codec(index = 2)] - #[doc = "See [`Pallet::set_key`]."] + #[doc = "Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo"] + #[doc = "key."] set_key { new: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 3)] - #[doc = "See [`Pallet::sudo_as`]."] + #[doc = "Authenticates the sudo key and dispatches a function call with `Signed` origin from"] + #[doc = "a given account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] sudo_as { who: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, call: ::std::boxed::Box, }, #[codec(index = 4)] - #[doc = "See [`Pallet::remove_key`]."] + #[doc = "Permanently removes the sudo key."] + #[doc = ""] + #[doc = "**This cannot be un-done.**"] remove_key, } #[derive( @@ -49072,7 +54788,25 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::set`]."] + #[doc = "Set the current time."] + #[doc = ""] + #[doc = "This call should be invoked exactly once per block. It will panic at the finalization"] + #[doc = "phase, if this call hasn't been invoked by that time."] + #[doc = ""] + #[doc = "The timestamp should be greater than the previous one by the amount specified by"] + #[doc = "[`Config::MinimumPeriod`]."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _None_."] + #[doc = ""] + #[doc = "This dispatch class is _Mandatory_ to ensure it gets executed in the block. Be aware"] + #[doc = "that changing the complexity of this call could result exhausting the resources in a"] + #[doc = "block to execute any other calls."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)` (Note that implementations of `OnTimestampSet` must also be `O(1)`)"] + #[doc = "- 1 storage read and 1 storage mutation (codec `O(1)` because of `DidUpdate::take` in"] + #[doc = " `on_finalize`)"] + #[doc = "- 1 event handler `on_timestamp_set`. Must be `O(1)`."] set { #[codec(compact)] now: ::core::primitive::u64, @@ -49200,39 +54934,145 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::propose_spend`]."] + #[doc = "Put forward a suggestion for spending."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be signed."] + #[doc = ""] + #[doc = "## Details"] + #[doc = "A deposit proportional to the value is reserved and slashed if the proposal is rejected."] + #[doc = "It is returned once the proposal is awarded."] + #[doc = ""] + #[doc = "### Complexity"] + #[doc = "- O(1)"] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::Proposed`] if successful."] propose_spend { #[codec(compact)] value: ::core::primitive::u128, beneficiary: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 1)] - #[doc = "See [`Pallet::reject_proposal`]."] + #[doc = "Reject a proposed spend."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::RejectOrigin`]."] + #[doc = ""] + #[doc = "## Details"] + #[doc = "The original deposit will be slashed."] + #[doc = ""] + #[doc = "### Complexity"] + #[doc = "- O(1)"] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::Rejected`] if successful."] reject_proposal { #[codec(compact)] proposal_id: ::core::primitive::u32, }, #[codec(index = 2)] - #[doc = "See [`Pallet::approve_proposal`]."] + #[doc = "Approve a proposal."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::ApproveOrigin`]."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "At a later time, the proposal will be allocated to the beneficiary and the original"] + #[doc = "deposit will be returned."] + #[doc = ""] + #[doc = "### Complexity"] + #[doc = " - O(1)."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "No events are emitted from this dispatch."] approve_proposal { #[codec(compact)] proposal_id: ::core::primitive::u32, }, #[codec(index = 3)] - #[doc = "See [`Pallet::spend_local`]."] + #[doc = "Propose and approve a spend of treasury funds."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::SpendOrigin`] with the `Success` value being at least `amount`."] + #[doc = ""] + #[doc = "### Details"] + #[doc = "NOTE: For record-keeping purposes, the proposer is deemed to be equivalent to the"] + #[doc = "beneficiary."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `amount`: The amount to be transferred from the treasury to the `beneficiary`."] + #[doc = "- `beneficiary`: The destination account for the transfer."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::SpendApproved`] if successful."] spend_local { #[codec(compact)] amount: ::core::primitive::u128, beneficiary: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 4)] - #[doc = "See [`Pallet::remove_approval`]."] + #[doc = "Force a previously approved proposal to be removed from the approval queue."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::RejectOrigin`]."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "The original deposit will no longer be returned."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `proposal_id`: The index of a proposal"] + #[doc = ""] + #[doc = "### Complexity"] + #[doc = "- O(A) where `A` is the number of approvals"] + #[doc = ""] + #[doc = "### Errors"] + #[doc = "- [`Error::ProposalNotApproved`]: The `proposal_id` supplied was not found in the"] + #[doc = " approval queue, i.e., the proposal has not been approved. This could also mean the"] + #[doc = " proposal does not exist altogether, thus there is no way it would have been approved"] + #[doc = " in the first place."] remove_approval { #[codec(compact)] proposal_id: ::core::primitive::u32, }, #[codec(index = 5)] - #[doc = "See [`Pallet::spend`]."] + #[doc = "Propose and approve a spend of treasury funds."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::SpendOrigin`] with the `Success` value being at least"] + #[doc = "`amount` of `asset_kind` in the native asset. The amount of `asset_kind` is converted"] + #[doc = "for assertion using the [`Config::BalanceConverter`]."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "Create an approved spend for transferring a specific `amount` of `asset_kind` to a"] + #[doc = "designated beneficiary. The spend must be claimed using the `payout` dispatchable within"] + #[doc = "the [`Config::PayoutPeriod`]."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `asset_kind`: An indicator of the specific asset class to be spent."] + #[doc = "- `amount`: The amount to be transferred from the treasury to the `beneficiary`."] + #[doc = "- `beneficiary`: The beneficiary of the spend."] + #[doc = "- `valid_from`: The block number from which the spend can be claimed. It can refer to"] + #[doc = " the past if the resulting spend has not yet expired according to the"] + #[doc = " [`Config::PayoutPeriod`]. If `None`, the spend can be claimed immediately after"] + #[doc = " approval."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::AssetSpendApproved`] if successful."] spend { asset_kind: ::std::boxed::Box< runtime_types::polkadot_runtime_common::impls::VersionedLocatableAsset, @@ -49243,13 +55083,64 @@ pub mod api { valid_from: ::core::option::Option<::core::primitive::u32>, }, #[codec(index = 6)] - #[doc = "See [`Pallet::payout`]."] + #[doc = "Claim a spend."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be signed."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "Spends must be claimed within some temporal bounds. A spend may be claimed within one"] + #[doc = "[`Config::PayoutPeriod`] from the `valid_from` block."] + #[doc = "In case of a payout failure, the spend status must be updated with the `check_status`"] + #[doc = "dispatchable before retrying with the current function."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `index`: The spend index."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::Paid`] if successful."] payout { index: ::core::primitive::u32 }, #[codec(index = 7)] - #[doc = "See [`Pallet::check_status`]."] + #[doc = "Check the status of the spend and remove it from the storage if processed."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be signed."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "The status check is a prerequisite for retrying a failed payout."] + #[doc = "If a spend has either succeeded or expired, it is removed from the storage by this"] + #[doc = "function. In such instances, transaction fees are refunded."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `index`: The spend index."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::PaymentFailed`] if the spend payout has failed."] + #[doc = "Emits [`Event::SpendProcessed`] if the spend payout has succeed."] check_status { index: ::core::primitive::u32 }, #[codec(index = 8)] - #[doc = "See [`Pallet::void_spend`]."] + #[doc = "Void previously approved spend."] + #[doc = ""] + #[doc = "## Dispatch Origin"] + #[doc = ""] + #[doc = "Must be [`Config::RejectOrigin`]."] + #[doc = ""] + #[doc = "## Details"] + #[doc = ""] + #[doc = "A spend void is only possible if the payout has not been attempted yet."] + #[doc = ""] + #[doc = "### Parameters"] + #[doc = "- `index`: The spend index."] + #[doc = ""] + #[doc = "## Events"] + #[doc = ""] + #[doc = "Emits [`Event::AssetSpendVoided`] if successful."] void_spend { index: ::core::primitive::u32 }, } #[derive( @@ -49465,34 +55356,97 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::batch`]."] + #[doc = "Send a batch of dispatch calls."] + #[doc = ""] + #[doc = "May be called from any origin except `None`."] + #[doc = ""] + #[doc = "- `calls`: The calls to be dispatched from the same origin. The number of call must not"] + #[doc = " exceed the constant: `batched_calls_limit` (available in constant metadata)."] + #[doc = ""] + #[doc = "If origin is root then the calls are dispatched without checking origin filter. (This"] + #[doc = "includes bypassing `frame_system::Config::BaseCallFilter`)."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(C) where C is the number of calls to be batched."] + #[doc = ""] + #[doc = "This will return `Ok` in all circumstances. To determine the success of the batch, an"] + #[doc = "event is deposited. If a call failed and the batch was interrupted, then the"] + #[doc = "`BatchInterrupted` event is deposited, along with the number of successful calls made"] + #[doc = "and the error of the failed call. If all were successful, then the `BatchCompleted`"] + #[doc = "event is deposited."] batch { calls: ::std::vec::Vec, }, #[codec(index = 1)] - #[doc = "See [`Pallet::as_derivative`]."] + #[doc = "Send a call through an indexed pseudonym of the sender."] + #[doc = ""] + #[doc = "Filter from origin are passed along. The call will be dispatched with an origin which"] + #[doc = "use the same filter as the origin of this call."] + #[doc = ""] + #[doc = "NOTE: If you need to ensure that any account-based filtering is not honored (i.e."] + #[doc = "because you expect `proxy` to have been used prior in the call stack and you do not want"] + #[doc = "the call restrictions to apply to any sub-accounts), then use `as_multi_threshold_1`"] + #[doc = "in the Multisig pallet instead."] + #[doc = ""] + #[doc = "NOTE: Prior to version *12, this was called `as_limited_sub`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] as_derivative { index: ::core::primitive::u16, call: ::std::boxed::Box, }, #[codec(index = 2)] - #[doc = "See [`Pallet::batch_all`]."] + #[doc = "Send a batch of dispatch calls and atomically execute them."] + #[doc = "The whole transaction will rollback and fail if any of the calls failed."] + #[doc = ""] + #[doc = "May be called from any origin except `None`."] + #[doc = ""] + #[doc = "- `calls`: The calls to be dispatched from the same origin. The number of call must not"] + #[doc = " exceed the constant: `batched_calls_limit` (available in constant metadata)."] + #[doc = ""] + #[doc = "If origin is root then the calls are dispatched without checking origin filter. (This"] + #[doc = "includes bypassing `frame_system::Config::BaseCallFilter`)."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(C) where C is the number of calls to be batched."] batch_all { calls: ::std::vec::Vec, }, #[codec(index = 3)] - #[doc = "See [`Pallet::dispatch_as`]."] + #[doc = "Dispatches a function call with a provided origin."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(1)."] dispatch_as { as_origin: ::std::boxed::Box, call: ::std::boxed::Box, }, #[codec(index = 4)] - #[doc = "See [`Pallet::force_batch`]."] + #[doc = "Send a batch of dispatch calls."] + #[doc = "Unlike `batch`, it allows errors and won't interrupt."] + #[doc = ""] + #[doc = "May be called from any origin except `None`."] + #[doc = ""] + #[doc = "- `calls`: The calls to be dispatched from the same origin. The number of call must not"] + #[doc = " exceed the constant: `batched_calls_limit` (available in constant metadata)."] + #[doc = ""] + #[doc = "If origin is root then the calls are dispatch without checking origin filter. (This"] + #[doc = "includes bypassing `frame_system::Config::BaseCallFilter`)."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- O(C) where C is the number of calls to be batched."] force_batch { calls: ::std::vec::Vec, }, #[codec(index = 5)] - #[doc = "See [`Pallet::with_weight`]."] + #[doc = "Dispatch a function call with a specified weight."] + #[doc = ""] + #[doc = "This function does not check the weight of the call, and instead allows the"] + #[doc = "Root origin to specify the weight of the call."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] with_weight { call: ::std::boxed::Box, weight: runtime_types::sp_weights::weight_v2::Weight, @@ -49573,15 +55527,45 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::vest`]."] + #[doc = "Unlock any vested funds of the sender account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_ and the sender must have funds still"] + #[doc = "locked under this pallet."] + #[doc = ""] + #[doc = "Emits either `VestingCompleted` or `VestingUpdated`."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] vest, #[codec(index = 1)] - #[doc = "See [`Pallet::vest_other`]."] + #[doc = "Unlock any vested funds of a `target` account."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `target`: The account whose vested funds should be unlocked. Must have funds still"] + #[doc = "locked under this pallet."] + #[doc = ""] + #[doc = "Emits either `VestingCompleted` or `VestingUpdated`."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] vest_other { target: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, }, #[codec(index = 2)] - #[doc = "See [`Pallet::vested_transfer`]."] + #[doc = "Create a vested transfer."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `target`: The account receiving the vested funds."] + #[doc = "- `schedule`: The vesting schedule attached to the transfer."] + #[doc = ""] + #[doc = "Emits `VestingCreated`."] + #[doc = ""] + #[doc = "NOTE: This will unlock all schedules through the current block."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] vested_transfer { target: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, schedule: runtime_types::pallet_vesting::vesting_info::VestingInfo< @@ -49590,7 +55574,20 @@ pub mod api { >, }, #[codec(index = 3)] - #[doc = "See [`Pallet::force_vested_transfer`]."] + #[doc = "Force a vested transfer."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] + #[doc = ""] + #[doc = "- `source`: The account whose funds should be transferred."] + #[doc = "- `target`: The account that should be transferred the vested funds."] + #[doc = "- `schedule`: The vesting schedule attached to the transfer."] + #[doc = ""] + #[doc = "Emits `VestingCreated`."] + #[doc = ""] + #[doc = "NOTE: This will unlock all schedules through the current block."] + #[doc = ""] + #[doc = "## Complexity"] + #[doc = "- `O(1)`."] force_vested_transfer { source: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, target: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, @@ -49600,13 +55597,38 @@ pub mod api { >, }, #[codec(index = 4)] - #[doc = "See [`Pallet::merge_schedules`]."] + #[doc = "Merge two vesting schedules together, creating a new vesting schedule that unlocks over"] + #[doc = "the highest possible start and end blocks. If both schedules have already started the"] + #[doc = "current block will be used as the schedule start; with the caveat that if one schedule"] + #[doc = "is finished by the current block, the other will be treated as the new merged schedule,"] + #[doc = "unmodified."] + #[doc = ""] + #[doc = "NOTE: If `schedule1_index == schedule2_index` this is a no-op."] + #[doc = "NOTE: This will unlock all schedules through the current block prior to merging."] + #[doc = "NOTE: If both schedules have ended by the current block, no new schedule will be created"] + #[doc = "and both will be removed."] + #[doc = ""] + #[doc = "Merged schedule attributes:"] + #[doc = "- `starting_block`: `MAX(schedule1.starting_block, scheduled2.starting_block,"] + #[doc = " current_block)`."] + #[doc = "- `ending_block`: `MAX(schedule1.ending_block, schedule2.ending_block)`."] + #[doc = "- `locked`: `schedule1.locked_at(current_block) + schedule2.locked_at(current_block)`."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Signed_."] + #[doc = ""] + #[doc = "- `schedule1_index`: index of the first schedule to merge."] + #[doc = "- `schedule2_index`: index of the second schedule to merge."] merge_schedules { schedule1_index: ::core::primitive::u32, schedule2_index: ::core::primitive::u32, }, #[codec(index = 5)] - #[doc = "See [`Pallet::force_remove_vesting_schedule`]."] + #[doc = "Force remove a vesting schedule"] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] + #[doc = ""] + #[doc = "- `target`: An account that has a vesting schedule"] + #[doc = "- `schedule_index`: The vesting schedule index that should be removed"] force_remove_vesting_schedule { target: ::subxt::utils::MultiAddress<::subxt::utils::AccountId32, ()>, schedule_index: ::core::primitive::u32, @@ -49719,20 +55741,16 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::whitelist_call`]."] whitelist_call { call_hash: ::subxt::utils::H256 }, #[codec(index = 1)] - #[doc = "See [`Pallet::remove_whitelisted_call`]."] remove_whitelisted_call { call_hash: ::subxt::utils::H256 }, #[codec(index = 2)] - #[doc = "See [`Pallet::dispatch_whitelisted_call`]."] dispatch_whitelisted_call { call_hash: ::subxt::utils::H256, call_encoded_len: ::core::primitive::u32, call_weight_witness: runtime_types::sp_weights::weight_v2::Weight, }, #[codec(index = 3)] - #[doc = "See [`Pallet::dispatch_whitelisted_call_with_preimage`]."] dispatch_whitelisted_call_with_preimage { call: ::std::boxed::Box, }, @@ -49811,13 +55829,29 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::send`]."] send { dest: ::std::boxed::Box, message: ::std::boxed::Box, }, #[codec(index = 1)] - #[doc = "See [`Pallet::teleport_assets`]."] + #[doc = "Teleport some assets from the local chain to some destination chain."] + #[doc = ""] + #[doc = "**This function is deprecated: Use `limited_teleport_assets` instead.**"] + #[doc = ""] + #[doc = "Fee payment on the destination side is made from the asset in the `assets` vector of"] + #[doc = "index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited,"] + #[doc = "with all fees taken as needed from the asset."] + #[doc = ""] + #[doc = "- `origin`: Must be capable of withdrawing the `assets` and executing XCM."] + #[doc = "- `dest`: Destination context for the assets. Will typically be `[Parent,"] + #[doc = " Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from"] + #[doc = " relay to parachain."] + #[doc = "- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will"] + #[doc = " generally be an `AccountId32` value."] + #[doc = "- `assets`: The assets to be withdrawn. This should include the assets used to pay the"] + #[doc = " fee on the `dest` chain."] + #[doc = "- `fee_asset_item`: The index into `assets` of the item which should be used to pay"] + #[doc = " fees."] teleport_assets { dest: ::std::boxed::Box, beneficiary: ::std::boxed::Box, @@ -49825,7 +55859,36 @@ pub mod api { fee_asset_item: ::core::primitive::u32, }, #[codec(index = 2)] - #[doc = "See [`Pallet::reserve_transfer_assets`]."] + #[doc = "Transfer some assets from the local chain to the destination chain through their local,"] + #[doc = "destination or remote reserve."] + #[doc = ""] + #[doc = "`assets` must have same reserve location and may not be teleportable to `dest`."] + #[doc = " - `assets` have local reserve: transfer assets to sovereign account of destination"] + #[doc = " chain and forward a notification XCM to `dest` to mint and deposit reserve-based"] + #[doc = " assets to `beneficiary`."] + #[doc = " - `assets` have destination reserve: burn local assets and forward a notification to"] + #[doc = " `dest` chain to withdraw the reserve assets from this chain's sovereign account and"] + #[doc = " deposit them to `beneficiary`."] + #[doc = " - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move"] + #[doc = " reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest`"] + #[doc = " to mint and deposit reserve-based assets to `beneficiary`."] + #[doc = ""] + #[doc = "**This function is deprecated: Use `limited_reserve_transfer_assets` instead.**"] + #[doc = ""] + #[doc = "Fee payment on the destination side is made from the asset in the `assets` vector of"] + #[doc = "index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited,"] + #[doc = "with all fees taken as needed from the asset."] + #[doc = ""] + #[doc = "- `origin`: Must be capable of withdrawing the `assets` and executing XCM."] + #[doc = "- `dest`: Destination context for the assets. Will typically be `[Parent,"] + #[doc = " Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from"] + #[doc = " relay to parachain."] + #[doc = "- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will"] + #[doc = " generally be an `AccountId32` value."] + #[doc = "- `assets`: The assets to be withdrawn. This should include the assets used to pay the"] + #[doc = " fee on the `dest` (and possibly reserve) chains."] + #[doc = "- `fee_asset_item`: The index into `assets` of the item which should be used to pay"] + #[doc = " fees."] reserve_transfer_assets { dest: ::std::boxed::Box, beneficiary: ::std::boxed::Box, @@ -49833,35 +55896,88 @@ pub mod api { fee_asset_item: ::core::primitive::u32, }, #[codec(index = 3)] - #[doc = "See [`Pallet::execute`]."] + #[doc = "Execute an XCM message from a local, signed, origin."] + #[doc = ""] + #[doc = "An event is deposited indicating whether `msg` could be executed completely or only"] + #[doc = "partially."] + #[doc = ""] + #[doc = "No more than `max_weight` will be used in its attempted execution. If this is less than"] + #[doc = "the maximum amount of weight that the message could take to be executed, then no"] + #[doc = "execution attempt will be made."] execute { message: ::std::boxed::Box, max_weight: runtime_types::sp_weights::weight_v2::Weight, }, #[codec(index = 4)] - #[doc = "See [`Pallet::force_xcm_version`]."] + #[doc = "Extoll that a particular destination can be communicated with through a particular"] + #[doc = "version of XCM."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `location`: The destination that is being described."] + #[doc = "- `xcm_version`: The latest version of XCM that `location` supports."] force_xcm_version { location: ::std::boxed::Box, version: ::core::primitive::u32, }, #[codec(index = 5)] - #[doc = "See [`Pallet::force_default_xcm_version`]."] + #[doc = "Set a safe XCM version (the version that XCM should be encoded with if the most recent"] + #[doc = "version a destination can accept is unknown)."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `maybe_xcm_version`: The default XCM encoding version, or `None` to disable."] force_default_xcm_version { maybe_xcm_version: ::core::option::Option<::core::primitive::u32>, }, #[codec(index = 6)] - #[doc = "See [`Pallet::force_subscribe_version_notify`]."] + #[doc = "Ask a location to notify us regarding their XCM version and any changes to it."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `location`: The location to which we should subscribe for XCM version notifications."] force_subscribe_version_notify { location: ::std::boxed::Box, }, #[codec(index = 7)] - #[doc = "See [`Pallet::force_unsubscribe_version_notify`]."] + #[doc = "Require that a particular destination should no longer notify us regarding any XCM"] + #[doc = "version changes."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `location`: The location to which we are currently subscribed for XCM version"] + #[doc = " notifications which we no longer desire."] force_unsubscribe_version_notify { location: ::std::boxed::Box, }, #[codec(index = 8)] - #[doc = "See [`Pallet::limited_reserve_transfer_assets`]."] + #[doc = "Transfer some assets from the local chain to the destination chain through their local,"] + #[doc = "destination or remote reserve."] + #[doc = ""] + #[doc = "`assets` must have same reserve location and may not be teleportable to `dest`."] + #[doc = " - `assets` have local reserve: transfer assets to sovereign account of destination"] + #[doc = " chain and forward a notification XCM to `dest` to mint and deposit reserve-based"] + #[doc = " assets to `beneficiary`."] + #[doc = " - `assets` have destination reserve: burn local assets and forward a notification to"] + #[doc = " `dest` chain to withdraw the reserve assets from this chain's sovereign account and"] + #[doc = " deposit them to `beneficiary`."] + #[doc = " - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move"] + #[doc = " reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest`"] + #[doc = " to mint and deposit reserve-based assets to `beneficiary`."] + #[doc = ""] + #[doc = "Fee payment on the destination side is made from the asset in the `assets` vector of"] + #[doc = "index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight"] + #[doc = "is needed than `weight_limit`, then the operation will fail and the assets send may be"] + #[doc = "at risk."] + #[doc = ""] + #[doc = "- `origin`: Must be capable of withdrawing the `assets` and executing XCM."] + #[doc = "- `dest`: Destination context for the assets. Will typically be `[Parent,"] + #[doc = " Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from"] + #[doc = " relay to parachain."] + #[doc = "- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will"] + #[doc = " generally be an `AccountId32` value."] + #[doc = "- `assets`: The assets to be withdrawn. This should include the assets used to pay the"] + #[doc = " fee on the `dest` (and possibly reserve) chains."] + #[doc = "- `fee_asset_item`: The index into `assets` of the item which should be used to pay"] + #[doc = " fees."] + #[doc = "- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase."] limited_reserve_transfer_assets { dest: ::std::boxed::Box, beneficiary: ::std::boxed::Box, @@ -49870,7 +55986,24 @@ pub mod api { weight_limit: runtime_types::xcm::v3::WeightLimit, }, #[codec(index = 9)] - #[doc = "See [`Pallet::limited_teleport_assets`]."] + #[doc = "Teleport some assets from the local chain to some destination chain."] + #[doc = ""] + #[doc = "Fee payment on the destination side is made from the asset in the `assets` vector of"] + #[doc = "index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight"] + #[doc = "is needed than `weight_limit`, then the operation will fail and the assets send may be"] + #[doc = "at risk."] + #[doc = ""] + #[doc = "- `origin`: Must be capable of withdrawing the `assets` and executing XCM."] + #[doc = "- `dest`: Destination context for the assets. Will typically be `[Parent,"] + #[doc = " Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from"] + #[doc = " relay to parachain."] + #[doc = "- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will"] + #[doc = " generally be an `AccountId32` value."] + #[doc = "- `assets`: The assets to be withdrawn. This should include the assets used to pay the"] + #[doc = " fee on the `dest` chain."] + #[doc = "- `fee_asset_item`: The index into `assets` of the item which should be used to pay"] + #[doc = " fees."] + #[doc = "- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase."] limited_teleport_assets { dest: ::std::boxed::Box, beneficiary: ::std::boxed::Box, @@ -49879,10 +56012,45 @@ pub mod api { weight_limit: runtime_types::xcm::v3::WeightLimit, }, #[codec(index = 10)] - #[doc = "See [`Pallet::force_suspension`]."] + #[doc = "Set or unset the global suspension state of the XCM executor."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `suspended`: `true` to suspend, `false` to resume."] force_suspension { suspended: ::core::primitive::bool }, #[codec(index = 11)] - #[doc = "See [`Pallet::transfer_assets`]."] + #[doc = "Transfer some assets from the local chain to the destination chain through their local,"] + #[doc = "destination or remote reserve, or through teleports."] + #[doc = ""] + #[doc = "Fee payment on the destination side is made from the asset in the `assets` vector of"] + #[doc = "index `fee_asset_item` (hence referred to as `fees`), up to enough to pay for"] + #[doc = "`weight_limit` of weight. If more weight is needed than `weight_limit`, then the"] + #[doc = "operation will fail and the assets sent may be at risk."] + #[doc = ""] + #[doc = "`assets` (excluding `fees`) must have same reserve location or otherwise be teleportable"] + #[doc = "to `dest`, no limitations imposed on `fees`."] + #[doc = " - for local reserve: transfer assets to sovereign account of destination chain and"] + #[doc = " forward a notification XCM to `dest` to mint and deposit reserve-based assets to"] + #[doc = " `beneficiary`."] + #[doc = " - for destination reserve: burn local assets and forward a notification to `dest` chain"] + #[doc = " to withdraw the reserve assets from this chain's sovereign account and deposit them"] + #[doc = " to `beneficiary`."] + #[doc = " - for remote reserve: burn local assets, forward XCM to reserve chain to move reserves"] + #[doc = " from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` to mint"] + #[doc = " and deposit reserve-based assets to `beneficiary`."] + #[doc = " - for teleports: burn local assets and forward XCM to `dest` chain to mint/teleport"] + #[doc = " assets and deposit them to `beneficiary`."] + #[doc = ""] + #[doc = "- `origin`: Must be capable of withdrawing the `assets` and executing XCM."] + #[doc = "- `dest`: Destination context for the assets. Will typically be `X2(Parent,"] + #[doc = " Parachain(..))` to send from parachain to parachain, or `X1(Parachain(..))` to send"] + #[doc = " from relay to parachain."] + #[doc = "- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will"] + #[doc = " generally be an `AccountId32` value."] + #[doc = "- `assets`: The assets to be withdrawn. This should include the assets used to pay the"] + #[doc = " fee on the `dest` (and possibly reserve) chains."] + #[doc = "- `fee_asset_item`: The index into `assets` of the item which should be used to pay"] + #[doc = " fees."] + #[doc = "- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase."] transfer_assets { dest: ::std::boxed::Box, beneficiary: ::std::boxed::Box, @@ -49890,6 +56058,17 @@ pub mod api { fee_asset_item: ::core::primitive::u32, weight_limit: runtime_types::xcm::v3::WeightLimit, }, + #[codec(index = 12)] + #[doc = "Claims assets trapped on this pallet because of leftover assets during XCM execution."] + #[doc = ""] + #[doc = "- `origin`: Anyone can call this extrinsic."] + #[doc = "- `assets`: The exact assets that were trapped. Use the version to specify what version"] + #[doc = "was the latest when they were trapped."] + #[doc = "- `beneficiary`: The location/account where the claimed assets will be deposited."] + claim_assets { + assets: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + }, } #[derive( :: subxt :: ext :: codec :: Decode, @@ -51290,6 +57469,31 @@ pub mod api { pub struct ApprovalVotingParams { pub max_approval_coalesce_count: ::core::primitive::u32, } + #[derive( + :: subxt :: ext :: codec :: Decode, + :: subxt :: ext :: codec :: Encode, + :: subxt :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + # [codec (crate = :: subxt :: ext :: codec)] + #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] + pub struct SchedulerParams<_0> { + pub group_rotation_frequency: _0, + pub paras_availability_period: _0, + pub max_validators_per_core: ::core::option::Option<_0>, + pub lookahead: ::core::primitive::u32, + pub num_cores: ::core::primitive::u32, + pub max_availability_timeouts: ::core::primitive::u32, + pub on_demand_queue_max_size: ::core::primitive::u32, + pub on_demand_target_queue_utilization: + runtime_types::sp_arithmetic::per_things::Perbill, + pub on_demand_fee_variability: + runtime_types::sp_arithmetic::per_things::Perbill, + pub on_demand_base_fee: ::core::primitive::u128, + pub ttl: _0, + } } } pub mod polkadot_runtime_common { @@ -51310,7 +57514,7 @@ pub mod api { #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { - # [codec (index = 0)] # [doc = "See [`Pallet::assign_perm_parachain_slot`]."] assign_perm_parachain_slot { id : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 1)] # [doc = "See [`Pallet::assign_temp_parachain_slot`]."] assign_temp_parachain_slot { id : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , lease_period_start : runtime_types :: polkadot_runtime_common :: assigned_slots :: SlotLeasePeriodStart , } , # [codec (index = 2)] # [doc = "See [`Pallet::unassign_parachain_slot`]."] unassign_parachain_slot { id : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 3)] # [doc = "See [`Pallet::set_max_permanent_slots`]."] set_max_permanent_slots { slots : :: core :: primitive :: u32 , } , # [codec (index = 4)] # [doc = "See [`Pallet::set_max_temporary_slots`]."] set_max_temporary_slots { slots : :: core :: primitive :: u32 , } , } + # [codec (index = 0)] # [doc = "Assign a permanent parachain slot and immediately create a lease for it."] assign_perm_parachain_slot { id : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 1)] # [doc = "Assign a temporary parachain slot. The function tries to create a lease for it"] # [doc = "immediately if `SlotLeasePeriodStart::Current` is specified, and if the number"] # [doc = "of currently active temporary slots is below `MaxTemporarySlotPerLeasePeriod`."] assign_temp_parachain_slot { id : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , lease_period_start : runtime_types :: polkadot_runtime_common :: assigned_slots :: SlotLeasePeriodStart , } , # [codec (index = 2)] # [doc = "Unassign a permanent or temporary parachain slot"] unassign_parachain_slot { id : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 3)] # [doc = "Sets the storage value [`MaxPermanentSlots`]."] set_max_permanent_slots { slots : :: core :: primitive :: u32 , } , # [codec (index = 4)] # [doc = "Sets the storage value [`MaxTemporarySlots`]."] set_max_temporary_slots { slots : :: core :: primitive :: u32 , } , } #[derive( :: subxt :: ext :: codec :: Decode, :: subxt :: ext :: codec :: Encode, @@ -51432,7 +57636,11 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::new_auction`]."] + #[doc = "Create a new auction."] + #[doc = ""] + #[doc = "This can only happen when there isn't already an auction in progress and may only be"] + #[doc = "called by the root origin. Accepts the `duration` of this auction and the"] + #[doc = "`lease_period_index` of the initial lease period of the four that are to be auctioned."] new_auction { #[codec(compact)] duration: ::core::primitive::u32, @@ -51440,7 +57648,22 @@ pub mod api { lease_period_index: ::core::primitive::u32, }, #[codec(index = 1)] - #[doc = "See [`Pallet::bid`]."] + #[doc = "Make a new bid from an account (including a parachain account) for deploying a new"] + #[doc = "parachain."] + #[doc = ""] + #[doc = "Multiple simultaneous bids from the same bidder are allowed only as long as all active"] + #[doc = "bids overlap each other (i.e. are mutually exclusive). Bids cannot be redacted."] + #[doc = ""] + #[doc = "- `sub` is the sub-bidder ID, allowing for multiple competing bids to be made by (and"] + #[doc = "funded by) the same account."] + #[doc = "- `auction_index` is the index of the auction to bid on. Should just be the present"] + #[doc = "value of `AuctionCounter`."] + #[doc = "- `first_slot` is the first lease period index of the range to bid on. This is the"] + #[doc = "absolute lease period index value, not an auction-specific offset."] + #[doc = "- `last_slot` is the last lease period index of the range to bid on. This is the"] + #[doc = "absolute lease period index value, not an auction-specific offset."] + #[doc = "- `amount` is the amount to bid to be held as deposit for the parachain should the"] + #[doc = "bid win. This amount is held throughout the range."] bid { #[codec(compact)] para: runtime_types::polkadot_parachain_primitives::primitives::Id, @@ -51454,7 +57677,9 @@ pub mod api { amount: ::core::primitive::u128, }, #[codec(index = 2)] - #[doc = "See [`Pallet::cancel_auction`]."] + #[doc = "Cancel an in-progress auction."] + #[doc = ""] + #[doc = "Can only be called by Root origin."] cancel_auction, } #[derive( @@ -51574,14 +57799,51 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::claim`]."] + #[doc = "Make a claim to collect your DOTs."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _None_."] + #[doc = ""] + #[doc = "Unsigned Validation:"] + #[doc = "A call to claim is deemed valid if the signature provided matches"] + #[doc = "the expected signed message of:"] + #[doc = ""] + #[doc = "> Ethereum Signed Message:"] + #[doc = "> (configured prefix string)(address)"] + #[doc = ""] + #[doc = "and `address` matches the `dest` account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `dest`: The destination account to payout the claim."] + #[doc = "- `ethereum_signature`: The signature of an ethereum signed message matching the format"] + #[doc = " described above."] + #[doc = ""] + #[doc = ""] + #[doc = "The weight of this call is invariant over the input parameters."] + #[doc = "Weight includes logic to validate unsigned `claim` call."] + #[doc = ""] + #[doc = "Total Complexity: O(1)"] + #[doc = ""] claim { dest: ::subxt::utils::AccountId32, ethereum_signature: runtime_types::polkadot_runtime_common::claims::EcdsaSignature, }, #[codec(index = 1)] - #[doc = "See [`Pallet::mint_claim`]."] + #[doc = "Mint a new claim to collect DOTs."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _Root_."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `who`: The Ethereum address allowed to collect this claim."] + #[doc = "- `value`: The number of DOTs that will be claimed."] + #[doc = "- `vesting_schedule`: An optional vesting schedule for these DOTs."] + #[doc = ""] + #[doc = ""] + #[doc = "The weight of this call is invariant over the input parameters."] + #[doc = "We assume worst case that both vesting and statement is being inserted."] + #[doc = ""] + #[doc = "Total Complexity: O(1)"] + #[doc = ""] mint_claim { who: runtime_types::polkadot_runtime_common::claims::EthereumAddress, value: ::core::primitive::u128, @@ -51595,7 +57857,33 @@ pub mod api { >, }, #[codec(index = 2)] - #[doc = "See [`Pallet::claim_attest`]."] + #[doc = "Make a claim to collect your DOTs by signing a statement."] + #[doc = ""] + #[doc = "The dispatch origin for this call must be _None_."] + #[doc = ""] + #[doc = "Unsigned Validation:"] + #[doc = "A call to `claim_attest` is deemed valid if the signature provided matches"] + #[doc = "the expected signed message of:"] + #[doc = ""] + #[doc = "> Ethereum Signed Message:"] + #[doc = "> (configured prefix string)(address)(statement)"] + #[doc = ""] + #[doc = "and `address` matches the `dest` account; the `statement` must match that which is"] + #[doc = "expected according to your purchase arrangement."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `dest`: The destination account to payout the claim."] + #[doc = "- `ethereum_signature`: The signature of an ethereum signed message matching the format"] + #[doc = " described above."] + #[doc = "- `statement`: The identity of the statement which is being attested to in the"] + #[doc = " signature."] + #[doc = ""] + #[doc = ""] + #[doc = "The weight of this call is invariant over the input parameters."] + #[doc = "Weight includes logic to validate unsigned `claim_attest` call."] + #[doc = ""] + #[doc = "Total Complexity: O(1)"] + #[doc = ""] claim_attest { dest: ::subxt::utils::AccountId32, ethereum_signature: @@ -51603,12 +57891,29 @@ pub mod api { statement: ::std::vec::Vec<::core::primitive::u8>, }, #[codec(index = 3)] - #[doc = "See [`Pallet::attest`]."] + #[doc = "Attest to a statement, needed to finalize the claims process."] + #[doc = ""] + #[doc = "WARNING: Insecure unless your chain includes `PrevalidateAttests` as a"] + #[doc = "`SignedExtension`."] + #[doc = ""] + #[doc = "Unsigned Validation:"] + #[doc = "A call to attest is deemed valid if the sender has a `Preclaim` registered"] + #[doc = "and provides a `statement` which is expected for the account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `statement`: The identity of the statement which is being attested to in the"] + #[doc = " signature."] + #[doc = ""] + #[doc = ""] + #[doc = "The weight of this call is invariant over the input parameters."] + #[doc = "Weight includes logic to do pre-validation on `attest` call."] + #[doc = ""] + #[doc = "Total Complexity: O(1)"] + #[doc = ""] attest { statement: ::std::vec::Vec<::core::primitive::u8>, }, #[codec(index = 4)] - #[doc = "See [`Pallet::move_claim`]."] move_claim { old: runtime_types::polkadot_runtime_common::claims::EthereumAddress, new: runtime_types::polkadot_runtime_common::claims::EthereumAddress, @@ -51725,7 +58030,11 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::create`]."] + #[doc = "Create a new crowdloaning campaign for a parachain slot with the given lease period"] + #[doc = "range."] + #[doc = ""] + #[doc = "This applies a lock to your parachain configuration, ensuring that it cannot be changed"] + #[doc = "by the parachain manager."] create { #[codec(compact)] index: runtime_types::polkadot_parachain_primitives::primitives::Id, @@ -51741,7 +58050,8 @@ pub mod api { ::core::option::Option, }, #[codec(index = 1)] - #[doc = "See [`Pallet::contribute`]."] + #[doc = "Contribute to a crowd sale. This will transfer some balance over to fund a parachain"] + #[doc = "slot. It will be withdrawable when the crowdloan has ended and the funds are unused."] contribute { #[codec(compact)] index: runtime_types::polkadot_parachain_primitives::primitives::Id, @@ -51751,26 +58061,48 @@ pub mod api { ::core::option::Option, }, #[codec(index = 2)] - #[doc = "See [`Pallet::withdraw`]."] + #[doc = "Withdraw full balance of a specific contributor."] + #[doc = ""] + #[doc = "Origin must be signed, but can come from anyone."] + #[doc = ""] + #[doc = "The fund must be either in, or ready for, retirement. For a fund to be *in* retirement,"] + #[doc = "then the retirement flag must be set. For a fund to be ready for retirement, then:"] + #[doc = "- it must not already be in retirement;"] + #[doc = "- the amount of raised funds must be bigger than the _free_ balance of the account;"] + #[doc = "- and either:"] + #[doc = " - the block number must be at least `end`; or"] + #[doc = " - the current lease period must be greater than the fund's `last_period`."] + #[doc = ""] + #[doc = "In this case, the fund's retirement flag is set and its `end` is reset to the current"] + #[doc = "block number."] + #[doc = ""] + #[doc = "- `who`: The account whose contribution should be withdrawn."] + #[doc = "- `index`: The parachain to whose crowdloan the contribution was made."] withdraw { who: ::subxt::utils::AccountId32, #[codec(compact)] index: runtime_types::polkadot_parachain_primitives::primitives::Id, }, #[codec(index = 3)] - #[doc = "See [`Pallet::refund`]."] + #[doc = "Automatically refund contributors of an ended crowdloan."] + #[doc = "Due to weight restrictions, this function may need to be called multiple"] + #[doc = "times to fully refund all users. We will refund `RemoveKeysLimit` users at a time."] + #[doc = ""] + #[doc = "Origin must be signed, but can come from anyone."] refund { #[codec(compact)] index: runtime_types::polkadot_parachain_primitives::primitives::Id, }, #[codec(index = 4)] - #[doc = "See [`Pallet::dissolve`]."] + #[doc = "Remove a fund after the retirement period has ended and all funds have been returned."] dissolve { #[codec(compact)] index: runtime_types::polkadot_parachain_primitives::primitives::Id, }, #[codec(index = 5)] - #[doc = "See [`Pallet::edit`]."] + #[doc = "Edit the configuration for an in-progress crowdloan."] + #[doc = ""] + #[doc = "Can only be called by Root origin."] edit { #[codec(compact)] index: runtime_types::polkadot_parachain_primitives::primitives::Id, @@ -51786,18 +58118,24 @@ pub mod api { ::core::option::Option, }, #[codec(index = 6)] - #[doc = "See [`Pallet::add_memo`]."] + #[doc = "Add an optional memo to an existing crowdloan contribution."] + #[doc = ""] + #[doc = "Origin must be Signed, and the user must have contributed to the crowdloan."] add_memo { index: runtime_types::polkadot_parachain_primitives::primitives::Id, memo: ::std::vec::Vec<::core::primitive::u8>, }, #[codec(index = 7)] - #[doc = "See [`Pallet::poke`]."] + #[doc = "Poke the fund into `NewRaise`"] + #[doc = ""] + #[doc = "Origin must be Signed, and the fund has non-zero raise."] poke { index: runtime_types::polkadot_parachain_primitives::primitives::Id, }, #[codec(index = 8)] - #[doc = "See [`Pallet::contribute_all`]."] + #[doc = "Contribute your entire balance to a crowd sale. This will transfer the entire balance of"] + #[doc = "a user over to fund a parachain slot. It will be withdrawable when the crowdloan has"] + #[doc = "ended and the funds are unused."] contribute_all { #[codec(compact)] index: runtime_types::polkadot_parachain_primitives::primitives::Id, @@ -52024,10 +58362,12 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::reap_identity`]."] + #[doc = "Reap the `IdentityInfo` of `who` from the Identity pallet of `T`, unreserving any"] + #[doc = "deposits held and removing storage items associated with `who`."] reap_identity { who: ::subxt::utils::AccountId32 }, #[codec(index = 1)] - #[doc = "See [`Pallet::poke_deposit`]."] + #[doc = "Update the deposit of `who`. Meant to be called by the system with an XCM `Transact`"] + #[doc = "Instruction."] poke_deposit { who: ::subxt::utils::AccountId32 }, } #[derive( @@ -52097,7 +58437,7 @@ pub mod api { #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { - # [codec (index = 0)] # [doc = "See [`Pallet::register`]."] register { id : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , genesis_head : runtime_types :: polkadot_parachain_primitives :: primitives :: HeadData , validation_code : runtime_types :: polkadot_parachain_primitives :: primitives :: ValidationCode , } , # [codec (index = 1)] # [doc = "See [`Pallet::force_register`]."] force_register { who : :: subxt :: utils :: AccountId32 , deposit : :: core :: primitive :: u128 , id : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , genesis_head : runtime_types :: polkadot_parachain_primitives :: primitives :: HeadData , validation_code : runtime_types :: polkadot_parachain_primitives :: primitives :: ValidationCode , } , # [codec (index = 2)] # [doc = "See [`Pallet::deregister`]."] deregister { id : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 3)] # [doc = "See [`Pallet::swap`]."] swap { id : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , other : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 4)] # [doc = "See [`Pallet::remove_lock`]."] remove_lock { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 5)] # [doc = "See [`Pallet::reserve`]."] reserve , # [codec (index = 6)] # [doc = "See [`Pallet::add_lock`]."] add_lock { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 7)] # [doc = "See [`Pallet::schedule_code_upgrade`]."] schedule_code_upgrade { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , new_code : runtime_types :: polkadot_parachain_primitives :: primitives :: ValidationCode , } , # [codec (index = 8)] # [doc = "See [`Pallet::set_current_head`]."] set_current_head { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , new_head : runtime_types :: polkadot_parachain_primitives :: primitives :: HeadData , } , } + # [codec (index = 0)] # [doc = "Register head data and validation code for a reserved Para Id."] # [doc = ""] # [doc = "## Arguments"] # [doc = "- `origin`: Must be called by a `Signed` origin."] # [doc = "- `id`: The para ID. Must be owned/managed by the `origin` signing account."] # [doc = "- `genesis_head`: The genesis head data of the parachain/thread."] # [doc = "- `validation_code`: The initial validation code of the parachain/thread."] # [doc = ""] # [doc = "## Deposits/Fees"] # [doc = "The account with the originating signature must reserve a deposit."] # [doc = ""] # [doc = "The deposit is required to cover the costs associated with storing the genesis head"] # [doc = "data and the validation code."] # [doc = "This accounts for the potential to store validation code of a size up to the"] # [doc = "`max_code_size`, as defined in the configuration pallet"] # [doc = ""] # [doc = "Anything already reserved previously for this para ID is accounted for."] # [doc = ""] # [doc = "## Events"] # [doc = "The `Registered` event is emitted in case of success."] register { id : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , genesis_head : runtime_types :: polkadot_parachain_primitives :: primitives :: HeadData , validation_code : runtime_types :: polkadot_parachain_primitives :: primitives :: ValidationCode , } , # [codec (index = 1)] # [doc = "Force the registration of a Para Id on the relay chain."] # [doc = ""] # [doc = "This function must be called by a Root origin."] # [doc = ""] # [doc = "The deposit taken can be specified for this registration. Any `ParaId`"] # [doc = "can be registered, including sub-1000 IDs which are System Parachains."] force_register { who : :: subxt :: utils :: AccountId32 , deposit : :: core :: primitive :: u128 , id : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , genesis_head : runtime_types :: polkadot_parachain_primitives :: primitives :: HeadData , validation_code : runtime_types :: polkadot_parachain_primitives :: primitives :: ValidationCode , } , # [codec (index = 2)] # [doc = "Deregister a Para Id, freeing all data and returning any deposit."] # [doc = ""] # [doc = "The caller must be Root, the `para` owner, or the `para` itself. The para must be an"] # [doc = "on-demand parachain."] deregister { id : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 3)] # [doc = "Swap a lease holding parachain with another parachain, either on-demand or lease"] # [doc = "holding."] # [doc = ""] # [doc = "The origin must be Root, the `para` owner, or the `para` itself."] # [doc = ""] # [doc = "The swap will happen only if there is already an opposite swap pending. If there is not,"] # [doc = "the swap will be stored in the pending swaps map, ready for a later confirmatory swap."] # [doc = ""] # [doc = "The `ParaId`s remain mapped to the same head data and code so external code can rely on"] # [doc = "`ParaId` to be a long-term identifier of a notional \"parachain\". However, their"] # [doc = "scheduling info (i.e. whether they're an on-demand parachain or lease holding"] # [doc = "parachain), auction information and the auction deposit are switched."] swap { id : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , other : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 4)] # [doc = "Remove a manager lock from a para. This will allow the manager of a"] # [doc = "previously locked para to deregister or swap a para without using governance."] # [doc = ""] # [doc = "Can only be called by the Root origin or the parachain."] remove_lock { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 5)] # [doc = "Reserve a Para Id on the relay chain."] # [doc = ""] # [doc = "This function will reserve a new Para Id to be owned/managed by the origin account."] # [doc = "The origin account is able to register head data and validation code using `register` to"] # [doc = "create an on-demand parachain. Using the Slots pallet, an on-demand parachain can then"] # [doc = "be upgraded to a lease holding parachain."] # [doc = ""] # [doc = "## Arguments"] # [doc = "- `origin`: Must be called by a `Signed` origin. Becomes the manager/owner of the new"] # [doc = " para ID."] # [doc = ""] # [doc = "## Deposits/Fees"] # [doc = "The origin must reserve a deposit of `ParaDeposit` for the registration."] # [doc = ""] # [doc = "## Events"] # [doc = "The `Reserved` event is emitted in case of success, which provides the ID reserved for"] # [doc = "use."] reserve , # [codec (index = 6)] # [doc = "Add a manager lock from a para. This will prevent the manager of a"] # [doc = "para to deregister or swap a para."] # [doc = ""] # [doc = "Can be called by Root, the parachain, or the parachain manager if the parachain is"] # [doc = "unlocked."] add_lock { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 7)] # [doc = "Schedule a parachain upgrade."] # [doc = ""] # [doc = "Can be called by Root, the parachain, or the parachain manager if the parachain is"] # [doc = "unlocked."] schedule_code_upgrade { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , new_code : runtime_types :: polkadot_parachain_primitives :: primitives :: ValidationCode , } , # [codec (index = 8)] # [doc = "Set the parachain's current head."] # [doc = ""] # [doc = "Can be called by Root, the parachain, or the parachain manager if the parachain is"] # [doc = "unlocked."] set_current_head { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , new_head : runtime_types :: polkadot_parachain_primitives :: primitives :: HeadData , } , } #[derive( :: subxt :: ext :: codec :: Decode, :: subxt :: ext :: codec :: Encode, @@ -52221,35 +58561,45 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::sudo_schedule_para_initialize`]."] + #[doc = "Schedule a para to be initialized at the start of the next session."] + #[doc = ""] + #[doc = "This should only be used for TESTING and not on PRODUCTION chains. It automatically"] + #[doc = "assigns Coretime to the chain and increases the number of cores. Thus, there is no"] + #[doc = "running coretime chain required."] sudo_schedule_para_initialize { id: runtime_types::polkadot_parachain_primitives::primitives::Id, genesis: runtime_types::polkadot_runtime_parachains::paras::ParaGenesisArgs, }, #[codec(index = 1)] - #[doc = "See [`Pallet::sudo_schedule_para_cleanup`]."] + #[doc = "Schedule a para to be cleaned up at the start of the next session."] sudo_schedule_para_cleanup { id: runtime_types::polkadot_parachain_primitives::primitives::Id, }, #[codec(index = 2)] - #[doc = "See [`Pallet::sudo_schedule_parathread_upgrade`]."] + #[doc = "Upgrade a parathread (on-demand parachain) to a lease holding parachain"] sudo_schedule_parathread_upgrade { id: runtime_types::polkadot_parachain_primitives::primitives::Id, }, #[codec(index = 3)] - #[doc = "See [`Pallet::sudo_schedule_parachain_downgrade`]."] + #[doc = "Downgrade a lease holding parachain to an on-demand parachain"] sudo_schedule_parachain_downgrade { id: runtime_types::polkadot_parachain_primitives::primitives::Id, }, #[codec(index = 4)] - #[doc = "See [`Pallet::sudo_queue_downward_xcm`]."] + #[doc = "Send a downward XCM to the given para."] + #[doc = ""] + #[doc = "The given parachain should exist and the payload should not exceed the preconfigured"] + #[doc = "size `config.max_downward_message_size`."] sudo_queue_downward_xcm { id: runtime_types::polkadot_parachain_primitives::primitives::Id, xcm: ::std::boxed::Box, }, #[codec(index = 5)] - #[doc = "See [`Pallet::sudo_establish_hrmp_channel`]."] + #[doc = "Forcefully establish a channel from the sender to the recipient."] + #[doc = ""] + #[doc = "This is equivalent to sending an `Hrmp::hrmp_init_open_channel` extrinsic followed by"] + #[doc = "`Hrmp::hrmp_accept_open_channel`."] sudo_establish_hrmp_channel { sender: runtime_types::polkadot_parachain_primitives::primitives::Id, recipient: runtime_types::polkadot_parachain_primitives::primitives::Id, @@ -52317,7 +58667,10 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::force_lease`]."] + #[doc = "Just a connect into the `lease_out` call, in case Root wants to force some lease to"] + #[doc = "happen independently of any other on-chain mechanism to use it."] + #[doc = ""] + #[doc = "The dispatch origin for this call must match `T::ForceOrigin`."] force_lease { para: runtime_types::polkadot_parachain_primitives::primitives::Id, leaser: ::subxt::utils::AccountId32, @@ -52326,12 +58679,20 @@ pub mod api { period_count: ::core::primitive::u32, }, #[codec(index = 1)] - #[doc = "See [`Pallet::clear_all_leases`]."] + #[doc = "Clear all leases for a Para Id, refunding any deposits back to the original owners."] + #[doc = ""] + #[doc = "The dispatch origin for this call must match `T::ForceOrigin`."] clear_all_leases { para: runtime_types::polkadot_parachain_primitives::primitives::Id, }, #[codec(index = 2)] - #[doc = "See [`Pallet::trigger_onboard`]."] + #[doc = "Try to onboard a parachain that has a lease for the current lease period."] + #[doc = ""] + #[doc = "This function can be useful if there was some state issue with a para that should"] + #[doc = "have onboarded, but was unable to. As long as they have a lease period, we can"] + #[doc = "let them onboard from here."] + #[doc = ""] + #[doc = "Origin must be signed, but can be called by anyone."] trigger_onboard { para: runtime_types::polkadot_parachain_primitives::primitives::Id, }, @@ -52526,13 +58887,43 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::place_order_allow_death`]."] + #[doc = "Create a single on demand core order."] + #[doc = "Will use the spot price for the current block and will reap the account if needed."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `origin`: The sender of the call, funds will be withdrawn from this account."] + #[doc = "- `max_amount`: The maximum balance to withdraw from the origin to place an order."] + #[doc = "- `para_id`: A `ParaId` the origin wants to provide blockspace for."] + #[doc = ""] + #[doc = "Errors:"] + #[doc = "- `InsufficientBalance`: from the Currency implementation"] + #[doc = "- `InvalidParaId`"] + #[doc = "- `QueueFull`"] + #[doc = "- `SpotPriceHigherThanMaxAmount`"] + #[doc = ""] + #[doc = "Events:"] + #[doc = "- `SpotOrderPlaced`"] place_order_allow_death { max_amount: ::core::primitive::u128, para_id: runtime_types::polkadot_parachain_primitives::primitives::Id, }, #[codec(index = 1)] - #[doc = "See [`Pallet::place_order_keep_alive`]."] + #[doc = "Same as the [`place_order_allow_death`](Self::place_order_allow_death) call , but with a"] + #[doc = "check that placing the order will not reap the account."] + #[doc = ""] + #[doc = "Parameters:"] + #[doc = "- `origin`: The sender of the call, funds will be withdrawn from this account."] + #[doc = "- `max_amount`: The maximum balance to withdraw from the origin to place an order."] + #[doc = "- `para_id`: A `ParaId` the origin wants to provide blockspace for."] + #[doc = ""] + #[doc = "Errors:"] + #[doc = "- `InsufficientBalance`: from the Currency implementation"] + #[doc = "- `InvalidParaId`"] + #[doc = "- `QueueFull`"] + #[doc = "- `SpotPriceHigherThanMaxAmount`"] + #[doc = ""] + #[doc = "Events:"] + #[doc = "- `SpotOrderPlaced`"] place_order_keep_alive { max_amount: ::core::primitive::u128, para_id: runtime_types::polkadot_parachain_primitives::primitives::Id, @@ -52631,7 +59022,7 @@ pub mod api { #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { - # [codec (index = 0)] # [doc = "See [`Pallet::set_validation_upgrade_cooldown`]."] set_validation_upgrade_cooldown { new : :: core :: primitive :: u32 , } , # [codec (index = 1)] # [doc = "See [`Pallet::set_validation_upgrade_delay`]."] set_validation_upgrade_delay { new : :: core :: primitive :: u32 , } , # [codec (index = 2)] # [doc = "See [`Pallet::set_code_retention_period`]."] set_code_retention_period { new : :: core :: primitive :: u32 , } , # [codec (index = 3)] # [doc = "See [`Pallet::set_max_code_size`]."] set_max_code_size { new : :: core :: primitive :: u32 , } , # [codec (index = 4)] # [doc = "See [`Pallet::set_max_pov_size`]."] set_max_pov_size { new : :: core :: primitive :: u32 , } , # [codec (index = 5)] # [doc = "See [`Pallet::set_max_head_data_size`]."] set_max_head_data_size { new : :: core :: primitive :: u32 , } , # [codec (index = 6)] # [doc = "See [`Pallet::set_coretime_cores`]."] set_coretime_cores { new : :: core :: primitive :: u32 , } , # [codec (index = 7)] # [doc = "See [`Pallet::set_on_demand_retries`]."] set_on_demand_retries { new : :: core :: primitive :: u32 , } , # [codec (index = 8)] # [doc = "See [`Pallet::set_group_rotation_frequency`]."] set_group_rotation_frequency { new : :: core :: primitive :: u32 , } , # [codec (index = 9)] # [doc = "See [`Pallet::set_paras_availability_period`]."] set_paras_availability_period { new : :: core :: primitive :: u32 , } , # [codec (index = 11)] # [doc = "See [`Pallet::set_scheduling_lookahead`]."] set_scheduling_lookahead { new : :: core :: primitive :: u32 , } , # [codec (index = 12)] # [doc = "See [`Pallet::set_max_validators_per_core`]."] set_max_validators_per_core { new : :: core :: option :: Option < :: core :: primitive :: u32 > , } , # [codec (index = 13)] # [doc = "See [`Pallet::set_max_validators`]."] set_max_validators { new : :: core :: option :: Option < :: core :: primitive :: u32 > , } , # [codec (index = 14)] # [doc = "See [`Pallet::set_dispute_period`]."] set_dispute_period { new : :: core :: primitive :: u32 , } , # [codec (index = 15)] # [doc = "See [`Pallet::set_dispute_post_conclusion_acceptance_period`]."] set_dispute_post_conclusion_acceptance_period { new : :: core :: primitive :: u32 , } , # [codec (index = 18)] # [doc = "See [`Pallet::set_no_show_slots`]."] set_no_show_slots { new : :: core :: primitive :: u32 , } , # [codec (index = 19)] # [doc = "See [`Pallet::set_n_delay_tranches`]."] set_n_delay_tranches { new : :: core :: primitive :: u32 , } , # [codec (index = 20)] # [doc = "See [`Pallet::set_zeroth_delay_tranche_width`]."] set_zeroth_delay_tranche_width { new : :: core :: primitive :: u32 , } , # [codec (index = 21)] # [doc = "See [`Pallet::set_needed_approvals`]."] set_needed_approvals { new : :: core :: primitive :: u32 , } , # [codec (index = 22)] # [doc = "See [`Pallet::set_relay_vrf_modulo_samples`]."] set_relay_vrf_modulo_samples { new : :: core :: primitive :: u32 , } , # [codec (index = 23)] # [doc = "See [`Pallet::set_max_upward_queue_count`]."] set_max_upward_queue_count { new : :: core :: primitive :: u32 , } , # [codec (index = 24)] # [doc = "See [`Pallet::set_max_upward_queue_size`]."] set_max_upward_queue_size { new : :: core :: primitive :: u32 , } , # [codec (index = 25)] # [doc = "See [`Pallet::set_max_downward_message_size`]."] set_max_downward_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 27)] # [doc = "See [`Pallet::set_max_upward_message_size`]."] set_max_upward_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 28)] # [doc = "See [`Pallet::set_max_upward_message_num_per_candidate`]."] set_max_upward_message_num_per_candidate { new : :: core :: primitive :: u32 , } , # [codec (index = 29)] # [doc = "See [`Pallet::set_hrmp_open_request_ttl`]."] set_hrmp_open_request_ttl { new : :: core :: primitive :: u32 , } , # [codec (index = 30)] # [doc = "See [`Pallet::set_hrmp_sender_deposit`]."] set_hrmp_sender_deposit { new : :: core :: primitive :: u128 , } , # [codec (index = 31)] # [doc = "See [`Pallet::set_hrmp_recipient_deposit`]."] set_hrmp_recipient_deposit { new : :: core :: primitive :: u128 , } , # [codec (index = 32)] # [doc = "See [`Pallet::set_hrmp_channel_max_capacity`]."] set_hrmp_channel_max_capacity { new : :: core :: primitive :: u32 , } , # [codec (index = 33)] # [doc = "See [`Pallet::set_hrmp_channel_max_total_size`]."] set_hrmp_channel_max_total_size { new : :: core :: primitive :: u32 , } , # [codec (index = 34)] # [doc = "See [`Pallet::set_hrmp_max_parachain_inbound_channels`]."] set_hrmp_max_parachain_inbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 36)] # [doc = "See [`Pallet::set_hrmp_channel_max_message_size`]."] set_hrmp_channel_max_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 37)] # [doc = "See [`Pallet::set_hrmp_max_parachain_outbound_channels`]."] set_hrmp_max_parachain_outbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 39)] # [doc = "See [`Pallet::set_hrmp_max_message_num_per_candidate`]."] set_hrmp_max_message_num_per_candidate { new : :: core :: primitive :: u32 , } , # [codec (index = 42)] # [doc = "See [`Pallet::set_pvf_voting_ttl`]."] set_pvf_voting_ttl { new : :: core :: primitive :: u32 , } , # [codec (index = 43)] # [doc = "See [`Pallet::set_minimum_validation_upgrade_delay`]."] set_minimum_validation_upgrade_delay { new : :: core :: primitive :: u32 , } , # [codec (index = 44)] # [doc = "See [`Pallet::set_bypass_consistency_check`]."] set_bypass_consistency_check { new : :: core :: primitive :: bool , } , # [codec (index = 45)] # [doc = "See [`Pallet::set_async_backing_params`]."] set_async_backing_params { new : runtime_types :: polkadot_primitives :: v6 :: async_backing :: AsyncBackingParams , } , # [codec (index = 46)] # [doc = "See [`Pallet::set_executor_params`]."] set_executor_params { new : runtime_types :: polkadot_primitives :: v6 :: executor_params :: ExecutorParams , } , # [codec (index = 47)] # [doc = "See [`Pallet::set_on_demand_base_fee`]."] set_on_demand_base_fee { new : :: core :: primitive :: u128 , } , # [codec (index = 48)] # [doc = "See [`Pallet::set_on_demand_fee_variability`]."] set_on_demand_fee_variability { new : runtime_types :: sp_arithmetic :: per_things :: Perbill , } , # [codec (index = 49)] # [doc = "See [`Pallet::set_on_demand_queue_max_size`]."] set_on_demand_queue_max_size { new : :: core :: primitive :: u32 , } , # [codec (index = 50)] # [doc = "See [`Pallet::set_on_demand_target_queue_utilization`]."] set_on_demand_target_queue_utilization { new : runtime_types :: sp_arithmetic :: per_things :: Perbill , } , # [codec (index = 51)] # [doc = "See [`Pallet::set_on_demand_ttl`]."] set_on_demand_ttl { new : :: core :: primitive :: u32 , } , # [codec (index = 52)] # [doc = "See [`Pallet::set_minimum_backing_votes`]."] set_minimum_backing_votes { new : :: core :: primitive :: u32 , } , # [codec (index = 53)] # [doc = "See [`Pallet::set_node_feature`]."] set_node_feature { index : :: core :: primitive :: u8 , value : :: core :: primitive :: bool , } , # [codec (index = 54)] # [doc = "See [`Pallet::set_approval_voting_params`]."] set_approval_voting_params { new : runtime_types :: polkadot_primitives :: vstaging :: ApprovalVotingParams , } , } + # [codec (index = 0)] # [doc = "Set the validation upgrade cooldown."] set_validation_upgrade_cooldown { new : :: core :: primitive :: u32 , } , # [codec (index = 1)] # [doc = "Set the validation upgrade delay."] set_validation_upgrade_delay { new : :: core :: primitive :: u32 , } , # [codec (index = 2)] # [doc = "Set the acceptance period for an included candidate."] set_code_retention_period { new : :: core :: primitive :: u32 , } , # [codec (index = 3)] # [doc = "Set the max validation code size for incoming upgrades."] set_max_code_size { new : :: core :: primitive :: u32 , } , # [codec (index = 4)] # [doc = "Set the max POV block size for incoming upgrades."] set_max_pov_size { new : :: core :: primitive :: u32 , } , # [codec (index = 5)] # [doc = "Set the max head data size for paras."] set_max_head_data_size { new : :: core :: primitive :: u32 , } , # [codec (index = 6)] # [doc = "Set the number of coretime execution cores."] # [doc = ""] # [doc = "Note that this configuration is managed by the coretime chain. Only manually change"] # [doc = "this, if you really know what you are doing!"] set_coretime_cores { new : :: core :: primitive :: u32 , } , # [codec (index = 7)] # [doc = "Set the max number of times a claim may timeout on a core before it is abandoned"] set_max_availability_timeouts { new : :: core :: primitive :: u32 , } , # [codec (index = 8)] # [doc = "Set the parachain validator-group rotation frequency"] set_group_rotation_frequency { new : :: core :: primitive :: u32 , } , # [codec (index = 9)] # [doc = "Set the availability period for paras."] set_paras_availability_period { new : :: core :: primitive :: u32 , } , # [codec (index = 11)] # [doc = "Set the scheduling lookahead, in expected number of blocks at peak throughput."] set_scheduling_lookahead { new : :: core :: primitive :: u32 , } , # [codec (index = 12)] # [doc = "Set the maximum number of validators to assign to any core."] set_max_validators_per_core { new : :: core :: option :: Option < :: core :: primitive :: u32 > , } , # [codec (index = 13)] # [doc = "Set the maximum number of validators to use in parachain consensus."] set_max_validators { new : :: core :: option :: Option < :: core :: primitive :: u32 > , } , # [codec (index = 14)] # [doc = "Set the dispute period, in number of sessions to keep for disputes."] set_dispute_period { new : :: core :: primitive :: u32 , } , # [codec (index = 15)] # [doc = "Set the dispute post conclusion acceptance period."] set_dispute_post_conclusion_acceptance_period { new : :: core :: primitive :: u32 , } , # [codec (index = 18)] # [doc = "Set the no show slots, in number of number of consensus slots."] # [doc = "Must be at least 1."] set_no_show_slots { new : :: core :: primitive :: u32 , } , # [codec (index = 19)] # [doc = "Set the total number of delay tranches."] set_n_delay_tranches { new : :: core :: primitive :: u32 , } , # [codec (index = 20)] # [doc = "Set the zeroth delay tranche width."] set_zeroth_delay_tranche_width { new : :: core :: primitive :: u32 , } , # [codec (index = 21)] # [doc = "Set the number of validators needed to approve a block."] set_needed_approvals { new : :: core :: primitive :: u32 , } , # [codec (index = 22)] # [doc = "Set the number of samples to do of the `RelayVRFModulo` approval assignment criterion."] set_relay_vrf_modulo_samples { new : :: core :: primitive :: u32 , } , # [codec (index = 23)] # [doc = "Sets the maximum items that can present in a upward dispatch queue at once."] set_max_upward_queue_count { new : :: core :: primitive :: u32 , } , # [codec (index = 24)] # [doc = "Sets the maximum total size of items that can present in a upward dispatch queue at"] # [doc = "once."] set_max_upward_queue_size { new : :: core :: primitive :: u32 , } , # [codec (index = 25)] # [doc = "Set the critical downward message size."] set_max_downward_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 27)] # [doc = "Sets the maximum size of an upward message that can be sent by a candidate."] set_max_upward_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 28)] # [doc = "Sets the maximum number of messages that a candidate can contain."] set_max_upward_message_num_per_candidate { new : :: core :: primitive :: u32 , } , # [codec (index = 29)] # [doc = "Sets the number of sessions after which an HRMP open channel request expires."] set_hrmp_open_request_ttl { new : :: core :: primitive :: u32 , } , # [codec (index = 30)] # [doc = "Sets the amount of funds that the sender should provide for opening an HRMP channel."] set_hrmp_sender_deposit { new : :: core :: primitive :: u128 , } , # [codec (index = 31)] # [doc = "Sets the amount of funds that the recipient should provide for accepting opening an HRMP"] # [doc = "channel."] set_hrmp_recipient_deposit { new : :: core :: primitive :: u128 , } , # [codec (index = 32)] # [doc = "Sets the maximum number of messages allowed in an HRMP channel at once."] set_hrmp_channel_max_capacity { new : :: core :: primitive :: u32 , } , # [codec (index = 33)] # [doc = "Sets the maximum total size of messages in bytes allowed in an HRMP channel at once."] set_hrmp_channel_max_total_size { new : :: core :: primitive :: u32 , } , # [codec (index = 34)] # [doc = "Sets the maximum number of inbound HRMP channels a parachain is allowed to accept."] set_hrmp_max_parachain_inbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 36)] # [doc = "Sets the maximum size of a message that could ever be put into an HRMP channel."] set_hrmp_channel_max_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 37)] # [doc = "Sets the maximum number of outbound HRMP channels a parachain is allowed to open."] set_hrmp_max_parachain_outbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 39)] # [doc = "Sets the maximum number of outbound HRMP messages can be sent by a candidate."] set_hrmp_max_message_num_per_candidate { new : :: core :: primitive :: u32 , } , # [codec (index = 42)] # [doc = "Set the number of session changes after which a PVF pre-checking voting is rejected."] set_pvf_voting_ttl { new : :: core :: primitive :: u32 , } , # [codec (index = 43)] # [doc = "Sets the minimum delay between announcing the upgrade block for a parachain until the"] # [doc = "upgrade taking place."] # [doc = ""] # [doc = "See the field documentation for information and constraints for the new value."] set_minimum_validation_upgrade_delay { new : :: core :: primitive :: u32 , } , # [codec (index = 44)] # [doc = "Setting this to true will disable consistency checks for the configuration setters."] # [doc = "Use with caution."] set_bypass_consistency_check { new : :: core :: primitive :: bool , } , # [codec (index = 45)] # [doc = "Set the asynchronous backing parameters."] set_async_backing_params { new : runtime_types :: polkadot_primitives :: v6 :: async_backing :: AsyncBackingParams , } , # [codec (index = 46)] # [doc = "Set PVF executor parameters."] set_executor_params { new : runtime_types :: polkadot_primitives :: v6 :: executor_params :: ExecutorParams , } , # [codec (index = 47)] # [doc = "Set the on demand (parathreads) base fee."] set_on_demand_base_fee { new : :: core :: primitive :: u128 , } , # [codec (index = 48)] # [doc = "Set the on demand (parathreads) fee variability."] set_on_demand_fee_variability { new : runtime_types :: sp_arithmetic :: per_things :: Perbill , } , # [codec (index = 49)] # [doc = "Set the on demand (parathreads) queue max size."] set_on_demand_queue_max_size { new : :: core :: primitive :: u32 , } , # [codec (index = 50)] # [doc = "Set the on demand (parathreads) fee variability."] set_on_demand_target_queue_utilization { new : runtime_types :: sp_arithmetic :: per_things :: Perbill , } , # [codec (index = 51)] # [doc = "Set the on demand (parathreads) ttl in the claimqueue."] set_on_demand_ttl { new : :: core :: primitive :: u32 , } , # [codec (index = 52)] # [doc = "Set the minimum backing votes threshold."] set_minimum_backing_votes { new : :: core :: primitive :: u32 , } , # [codec (index = 53)] # [doc = "Set/Unset a node feature."] set_node_feature { index : :: core :: primitive :: u8 , value : :: core :: primitive :: bool , } , # [codec (index = 54)] # [doc = "Set approval-voting-params."] set_approval_voting_params { new : runtime_types :: polkadot_primitives :: vstaging :: ApprovalVotingParams , } , # [codec (index = 55)] # [doc = "Set scheduler-params."] set_scheduler_params { new : runtime_types :: polkadot_primitives :: vstaging :: SchedulerParams < :: core :: primitive :: u32 > , } , } #[derive( :: subxt :: ext :: codec :: Decode, :: subxt :: ext :: codec :: Encode, @@ -52683,19 +59074,6 @@ pub mod api { pub executor_params: runtime_types::polkadot_primitives::v6::executor_params::ExecutorParams, pub code_retention_period: _0, - pub coretime_cores: ::core::primitive::u32, - pub on_demand_retries: ::core::primitive::u32, - pub on_demand_queue_max_size: ::core::primitive::u32, - pub on_demand_target_queue_utilization: - runtime_types::sp_arithmetic::per_things::Perbill, - pub on_demand_fee_variability: - runtime_types::sp_arithmetic::per_things::Perbill, - pub on_demand_base_fee: ::core::primitive::u128, - pub on_demand_ttl: _0, - pub group_rotation_frequency: _0, - pub paras_availability_period: _0, - pub scheduling_lookahead: ::core::primitive::u32, - pub max_validators_per_core: ::core::option::Option<_0>, pub max_validators: ::core::option::Option<_0>, pub dispute_period: ::core::primitive::u32, pub dispute_post_conclusion_acceptance_period: _0, @@ -52713,6 +59091,8 @@ pub mod api { >, pub approval_voting_params: runtime_types::polkadot_primitives::vstaging::ApprovalVotingParams, + pub scheduler_params: + runtime_types::polkadot_primitives::vstaging::SchedulerParams<_0>, } } pub mod coretime { @@ -52731,7 +59111,7 @@ pub mod api { #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { - # [codec (index = 1)] # [doc = "See [`Pallet::request_core_count`]."] request_core_count { count : :: core :: primitive :: u16 , } , # [codec (index = 4)] # [doc = "See [`Pallet::assign_core`]."] assign_core { core : :: core :: primitive :: u16 , begin : :: core :: primitive :: u32 , assignment : :: std :: vec :: Vec < (runtime_types :: pallet_broker :: coretime_interface :: CoreAssignment , runtime_types :: polkadot_runtime_parachains :: assigner_coretime :: PartsOf57600 ,) > , end_hint : :: core :: option :: Option < :: core :: primitive :: u32 > , } , } + # [codec (index = 1)] request_core_count { count : :: core :: primitive :: u16 , } , # [codec (index = 4)] # [doc = "Receive instructions from the `ExternalBrokerOrigin`, detailing how a specific core is"] # [doc = "to be used."] # [doc = ""] # [doc = "Parameters:"] # [doc = "-`origin`: The `ExternalBrokerOrigin`, assumed to be the Broker system parachain."] # [doc = "-`core`: The core that should be scheduled."] # [doc = "-`begin`: The starting blockheight of the instruction."] # [doc = "-`assignment`: How the blockspace should be utilised."] # [doc = "-`end_hint`: An optional hint as to when this particular set of instructions will end."] assign_core { core : :: core :: primitive :: u16 , begin : :: core :: primitive :: u32 , assignment : :: std :: vec :: Vec < (runtime_types :: pallet_broker :: coretime_interface :: CoreAssignment , runtime_types :: polkadot_runtime_parachains :: assigner_coretime :: PartsOf57600 ,) > , end_hint : :: core :: option :: Option < :: core :: primitive :: u32 > , } , } #[derive( :: subxt :: ext :: codec :: Decode, :: subxt :: ext :: codec :: Encode, @@ -52788,7 +59168,6 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::force_unfreeze`]."] force_unfreeze, } #[derive( @@ -52881,7 +59260,6 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::report_dispute_lost_unsigned`]."] report_dispute_lost_unsigned { dispute_proof: ::std::boxed::Box< runtime_types::polkadot_primitives::v6::slashing::DisputeProof, @@ -52972,7 +59350,7 @@ pub mod api { #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { - # [codec (index = 0)] # [doc = "See [`Pallet::hrmp_init_open_channel`]."] hrmp_init_open_channel { recipient : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , proposed_max_capacity : :: core :: primitive :: u32 , proposed_max_message_size : :: core :: primitive :: u32 , } , # [codec (index = 1)] # [doc = "See [`Pallet::hrmp_accept_open_channel`]."] hrmp_accept_open_channel { sender : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 2)] # [doc = "See [`Pallet::hrmp_close_channel`]."] hrmp_close_channel { channel_id : runtime_types :: polkadot_parachain_primitives :: primitives :: HrmpChannelId , } , # [codec (index = 3)] # [doc = "See [`Pallet::force_clean_hrmp`]."] force_clean_hrmp { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , num_inbound : :: core :: primitive :: u32 , num_outbound : :: core :: primitive :: u32 , } , # [codec (index = 4)] # [doc = "See [`Pallet::force_process_hrmp_open`]."] force_process_hrmp_open { channels : :: core :: primitive :: u32 , } , # [codec (index = 5)] # [doc = "See [`Pallet::force_process_hrmp_close`]."] force_process_hrmp_close { channels : :: core :: primitive :: u32 , } , # [codec (index = 6)] # [doc = "See [`Pallet::hrmp_cancel_open_request`]."] hrmp_cancel_open_request { channel_id : runtime_types :: polkadot_parachain_primitives :: primitives :: HrmpChannelId , open_requests : :: core :: primitive :: u32 , } , # [codec (index = 7)] # [doc = "See [`Pallet::force_open_hrmp_channel`]."] force_open_hrmp_channel { sender : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , recipient : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , max_capacity : :: core :: primitive :: u32 , max_message_size : :: core :: primitive :: u32 , } , # [codec (index = 8)] # [doc = "See [`Pallet::establish_system_channel`]."] establish_system_channel { sender : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , recipient : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 9)] # [doc = "See [`Pallet::poke_channel_deposits`]."] poke_channel_deposits { sender : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , recipient : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , } + # [codec (index = 0)] # [doc = "Initiate opening a channel from a parachain to a given recipient with given channel"] # [doc = "parameters."] # [doc = ""] # [doc = "- `proposed_max_capacity` - specifies how many messages can be in the channel at once."] # [doc = "- `proposed_max_message_size` - specifies the maximum size of the messages."] # [doc = ""] # [doc = "These numbers are a subject to the relay-chain configuration limits."] # [doc = ""] # [doc = "The channel can be opened only after the recipient confirms it and only on a session"] # [doc = "change."] hrmp_init_open_channel { recipient : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , proposed_max_capacity : :: core :: primitive :: u32 , proposed_max_message_size : :: core :: primitive :: u32 , } , # [codec (index = 1)] # [doc = "Accept a pending open channel request from the given sender."] # [doc = ""] # [doc = "The channel will be opened only on the next session boundary."] hrmp_accept_open_channel { sender : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 2)] # [doc = "Initiate unilateral closing of a channel. The origin must be either the sender or the"] # [doc = "recipient in the channel being closed."] # [doc = ""] # [doc = "The closure can only happen on a session change."] hrmp_close_channel { channel_id : runtime_types :: polkadot_parachain_primitives :: primitives :: HrmpChannelId , } , # [codec (index = 3)] # [doc = "This extrinsic triggers the cleanup of all the HRMP storage items that a para may have."] # [doc = "Normally this happens once per session, but this allows you to trigger the cleanup"] # [doc = "immediately for a specific parachain."] # [doc = ""] # [doc = "Number of inbound and outbound channels for `para` must be provided as witness data."] # [doc = ""] # [doc = "Origin must be the `ChannelManager`."] force_clean_hrmp { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , num_inbound : :: core :: primitive :: u32 , num_outbound : :: core :: primitive :: u32 , } , # [codec (index = 4)] # [doc = "Force process HRMP open channel requests."] # [doc = ""] # [doc = "If there are pending HRMP open channel requests, you can use this function to process"] # [doc = "all of those requests immediately."] # [doc = ""] # [doc = "Total number of opening channels must be provided as witness data."] # [doc = ""] # [doc = "Origin must be the `ChannelManager`."] force_process_hrmp_open { channels : :: core :: primitive :: u32 , } , # [codec (index = 5)] # [doc = "Force process HRMP close channel requests."] # [doc = ""] # [doc = "If there are pending HRMP close channel requests, you can use this function to process"] # [doc = "all of those requests immediately."] # [doc = ""] # [doc = "Total number of closing channels must be provided as witness data."] # [doc = ""] # [doc = "Origin must be the `ChannelManager`."] force_process_hrmp_close { channels : :: core :: primitive :: u32 , } , # [codec (index = 6)] # [doc = "This cancels a pending open channel request. It can be canceled by either of the sender"] # [doc = "or the recipient for that request. The origin must be either of those."] # [doc = ""] # [doc = "The cancellation happens immediately. It is not possible to cancel the request if it is"] # [doc = "already accepted."] # [doc = ""] # [doc = "Total number of open requests (i.e. `HrmpOpenChannelRequestsList`) must be provided as"] # [doc = "witness data."] hrmp_cancel_open_request { channel_id : runtime_types :: polkadot_parachain_primitives :: primitives :: HrmpChannelId , open_requests : :: core :: primitive :: u32 , } , # [codec (index = 7)] # [doc = "Open a channel from a `sender` to a `recipient` `ParaId`. Although opened by governance,"] # [doc = "the `max_capacity` and `max_message_size` are still subject to the Relay Chain's"] # [doc = "configured limits."] # [doc = ""] # [doc = "Expected use is when one (and only one) of the `ParaId`s involved in the channel is"] # [doc = "governed by the system, e.g. a system parachain."] # [doc = ""] # [doc = "Origin must be the `ChannelManager`."] force_open_hrmp_channel { sender : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , recipient : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , max_capacity : :: core :: primitive :: u32 , max_message_size : :: core :: primitive :: u32 , } , # [codec (index = 8)] # [doc = "Establish an HRMP channel between two system chains. If the channel does not already"] # [doc = "exist, the transaction fees will be refunded to the caller. The system does not take"] # [doc = "deposits for channels between system chains, and automatically sets the message number"] # [doc = "and size limits to the maximum allowed by the network's configuration."] # [doc = ""] # [doc = "Arguments:"] # [doc = ""] # [doc = "- `sender`: A system chain, `ParaId`."] # [doc = "- `recipient`: A system chain, `ParaId`."] # [doc = ""] # [doc = "Any signed origin can call this function, but _both_ inputs MUST be system chains. If"] # [doc = "the channel does not exist yet, there is no fee."] establish_system_channel { sender : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , recipient : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 9)] # [doc = "Update the deposits held for an HRMP channel to the latest `Configuration`. Channels"] # [doc = "with system chains do not require a deposit."] # [doc = ""] # [doc = "Arguments:"] # [doc = ""] # [doc = "- `sender`: A chain, `ParaId`."] # [doc = "- `recipient`: A chain, `ParaId`."] # [doc = ""] # [doc = "Any signed origin can call this function."] poke_channel_deposits { sender : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , recipient : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , } #[derive( :: subxt :: ext :: codec :: Decode, :: subxt :: ext :: codec :: Encode, @@ -53355,7 +59733,9 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::force_approve`]."] + #[doc = "Issue a signal to the consensus engine to forcibly act as though all parachain"] + #[doc = "blocks in all relay chain blocks up to and including the given number in the current"] + #[doc = "chain are valid and should be finalized."] force_approve { up_to: ::core::primitive::u32 }, } } @@ -53415,7 +59795,7 @@ pub mod api { #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { - # [codec (index = 0)] # [doc = "See [`Pallet::force_set_current_code`]."] force_set_current_code { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , new_code : runtime_types :: polkadot_parachain_primitives :: primitives :: ValidationCode , } , # [codec (index = 1)] # [doc = "See [`Pallet::force_set_current_head`]."] force_set_current_head { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , new_head : runtime_types :: polkadot_parachain_primitives :: primitives :: HeadData , } , # [codec (index = 2)] # [doc = "See [`Pallet::force_schedule_code_upgrade`]."] force_schedule_code_upgrade { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , new_code : runtime_types :: polkadot_parachain_primitives :: primitives :: ValidationCode , relay_parent_number : :: core :: primitive :: u32 , } , # [codec (index = 3)] # [doc = "See [`Pallet::force_note_new_head`]."] force_note_new_head { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , new_head : runtime_types :: polkadot_parachain_primitives :: primitives :: HeadData , } , # [codec (index = 4)] # [doc = "See [`Pallet::force_queue_action`]."] force_queue_action { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 5)] # [doc = "See [`Pallet::add_trusted_validation_code`]."] add_trusted_validation_code { validation_code : runtime_types :: polkadot_parachain_primitives :: primitives :: ValidationCode , } , # [codec (index = 6)] # [doc = "See [`Pallet::poke_unused_validation_code`]."] poke_unused_validation_code { validation_code_hash : runtime_types :: polkadot_parachain_primitives :: primitives :: ValidationCodeHash , } , # [codec (index = 7)] # [doc = "See [`Pallet::include_pvf_check_statement`]."] include_pvf_check_statement { stmt : runtime_types :: polkadot_primitives :: v6 :: PvfCheckStatement , signature : runtime_types :: polkadot_primitives :: v6 :: validator_app :: Signature , } , # [codec (index = 8)] # [doc = "See [`Pallet::force_set_most_recent_context`]."] force_set_most_recent_context { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , context : :: core :: primitive :: u32 , } , } + # [codec (index = 0)] # [doc = "Set the storage for the parachain validation code immediately."] force_set_current_code { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , new_code : runtime_types :: polkadot_parachain_primitives :: primitives :: ValidationCode , } , # [codec (index = 1)] # [doc = "Set the storage for the current parachain head data immediately."] force_set_current_head { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , new_head : runtime_types :: polkadot_parachain_primitives :: primitives :: HeadData , } , # [codec (index = 2)] # [doc = "Schedule an upgrade as if it was scheduled in the given relay parent block."] force_schedule_code_upgrade { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , new_code : runtime_types :: polkadot_parachain_primitives :: primitives :: ValidationCode , relay_parent_number : :: core :: primitive :: u32 , } , # [codec (index = 3)] # [doc = "Note a new block head for para within the context of the current block."] force_note_new_head { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , new_head : runtime_types :: polkadot_parachain_primitives :: primitives :: HeadData , } , # [codec (index = 4)] # [doc = "Put a parachain directly into the next session's action queue."] # [doc = "We can't queue it any sooner than this without going into the"] # [doc = "initializer..."] force_queue_action { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , } , # [codec (index = 5)] # [doc = "Adds the validation code to the storage."] # [doc = ""] # [doc = "The code will not be added if it is already present. Additionally, if PVF pre-checking"] # [doc = "is running for that code, it will be instantly accepted."] # [doc = ""] # [doc = "Otherwise, the code will be added into the storage. Note that the code will be added"] # [doc = "into storage with reference count 0. This is to account the fact that there are no users"] # [doc = "for this code yet. The caller will have to make sure that this code eventually gets"] # [doc = "used by some parachain or removed from the storage to avoid storage leaks. For the"] # [doc = "latter prefer to use the `poke_unused_validation_code` dispatchable to raw storage"] # [doc = "manipulation."] # [doc = ""] # [doc = "This function is mainly meant to be used for upgrading parachains that do not follow"] # [doc = "the go-ahead signal while the PVF pre-checking feature is enabled."] add_trusted_validation_code { validation_code : runtime_types :: polkadot_parachain_primitives :: primitives :: ValidationCode , } , # [codec (index = 6)] # [doc = "Remove the validation code from the storage iff the reference count is 0."] # [doc = ""] # [doc = "This is better than removing the storage directly, because it will not remove the code"] # [doc = "that was suddenly got used by some parachain while this dispatchable was pending"] # [doc = "dispatching."] poke_unused_validation_code { validation_code_hash : runtime_types :: polkadot_parachain_primitives :: primitives :: ValidationCodeHash , } , # [codec (index = 7)] # [doc = "Includes a statement for a PVF pre-checking vote. Potentially, finalizes the vote and"] # [doc = "enacts the results if that was the last vote before achieving the supermajority."] include_pvf_check_statement { stmt : runtime_types :: polkadot_primitives :: v6 :: PvfCheckStatement , signature : runtime_types :: polkadot_primitives :: v6 :: validator_app :: Signature , } , # [codec (index = 8)] # [doc = "Set the storage for the current parachain head data immediately."] force_set_most_recent_context { para : runtime_types :: polkadot_parachain_primitives :: primitives :: Id , context : :: core :: primitive :: u32 , } , } #[derive( :: subxt :: ext :: codec :: Decode, :: subxt :: ext :: codec :: Encode, @@ -53634,7 +60014,7 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::enter`]."] + #[doc = "Enter the paras inherent. This will process bitfields and backed candidates."] enter { data: runtime_types::polkadot_primitives::v6::InherentData< runtime_types::sp_runtime::generic::header::Header< @@ -53864,12 +60244,16 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 0)] - #[doc = "See [`Pallet::register_validators`]."] + #[doc = "Add new validators to the set."] + #[doc = ""] + #[doc = "The new validators will be active from current session + 2."] register_validators { validators: ::std::vec::Vec<::subxt::utils::AccountId32>, }, #[codec(index = 1)] - #[doc = "See [`Pallet::deregister_validators`]."] + #[doc = "Remove validators from the set."] + #[doc = ""] + #[doc = "The removed validators will be deactivated from current session + 2."] deregister_validators { validators: ::std::vec::Vec<::subxt::utils::AccountId32>, }, @@ -55911,6 +62295,22 @@ pub mod api { # [codec (crate = :: subxt :: ext :: codec)] #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] + pub enum ExtrinsicInclusionMode { + #[codec(index = 0)] + AllExtrinsics, + #[codec(index = 1)] + OnlyInherents, + } + #[derive( + :: subxt :: ext :: codec :: Decode, + :: subxt :: ext :: codec :: Encode, + :: subxt :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + # [codec (crate = :: subxt :: ext :: codec)] + #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] pub struct ModuleError { pub index: ::core::primitive::u8, pub error: [::core::primitive::u8; 4usize], diff --git a/testing/integration-tests/src/full_client/storage/mod.rs b/testing/integration-tests/src/full_client/storage/mod.rs index cf05042683..64c66723b2 100644 --- a/testing/integration-tests/src/full_client/storage/mod.rs +++ b/testing/integration-tests/src/full_client/storage/mod.rs @@ -60,10 +60,7 @@ async fn storage_map_lookup() -> Result<(), subxt::Error> { Ok(()) } -// This fails until the fix in https://github.com/paritytech/subxt/pull/458 is introduced. -// Here we create a key that looks a bit like a StorageNMap key, but should in fact be -// treated as a StorageKey (ie we should hash both values together with one hasher, rather -// than hash both values separately, or ignore the second value). + #[cfg(fullclient)] #[subxt_test] async fn storage_n_mapish_key_is_properly_created() -> Result<(), subxt::Error> { @@ -78,18 +75,21 @@ async fn storage_n_mapish_key_is_properly_created() -> Result<(), subxt::Error> .session() .key_owner(KeyTypeId([1, 2, 3, 4]), [5u8, 6, 7, 8]); let actual_key_bytes = api.storage().address_bytes(&actual_key)?; - // Let's manually hash to what we assume it should be and compare: let expected_key_bytes = { // Hash the prefix to the storage entry: let mut bytes = sp_core::twox_128("Session".as_bytes()).to_vec(); bytes.extend(&sp_core::twox_128("KeyOwner".as_bytes())[..]); - // twox64_concat a *tuple* of the args expected: - let suffix = (KeyTypeId([1, 2, 3, 4]), vec![5u8, 6, 7, 8]).encode(); - bytes.extend(sp_core::twox_64(&suffix)); - bytes.extend(&suffix); + // Both keys, use twox64_concat hashers: + let key1 = KeyTypeId([1, 2, 3, 4]).encode(); + let key2 = vec![5u8, 6, 7, 8].encode(); + bytes.extend(sp_core::twox_64(&key1)); + bytes.extend(&key1); + bytes.extend(sp_core::twox_64(&key2)); + bytes.extend(&key2); bytes }; + dbg!(&expected_key_bytes); assert_eq!(actual_key_bytes, expected_key_bytes); Ok(()) @@ -174,9 +174,9 @@ async fn storage_partial_lookup() -> Result<(), subxt::Error> { let addr_bytes = api.storage().address_bytes(&addr)?; let mut results = api.storage().at_latest().await?.iter(addr).await?; let mut approvals = Vec::new(); - while let Some(Ok((key, value))) = results.next().await { - assert!(key.starts_with(&addr_bytes)); - approvals.push(value); + while let Some(Ok(kv)) = results.next().await { + assert!(kv.key_bytes.starts_with(&addr_bytes)); + approvals.push(kv.value); } assert_eq!(approvals.len(), assets.len()); let mut amounts = approvals.iter().map(|a| a.amount).collect::>(); @@ -195,9 +195,10 @@ async fn storage_partial_lookup() -> Result<(), subxt::Error> { let mut results = api.storage().at_latest().await?.iter(addr).await?; let mut approvals = Vec::new(); - while let Some(Ok((key, value))) = results.next().await { - assert!(key.starts_with(&addr_bytes)); - approvals.push(value); + while let Some(Ok(kv)) = results.next().await { + assert!(kv.key_bytes.starts_with(&addr_bytes)); + assert!(kv.keys.decoded().is_ok()); + approvals.push(kv.value); } assert_eq!(approvals.len(), 1); assert_eq!(approvals[0].amount, amount); diff --git a/testing/integration-tests/src/light_client/mod.rs b/testing/integration-tests/src/light_client/mod.rs index 0694273ba5..235ba09f85 100644 --- a/testing/integration-tests/src/light_client/mod.rs +++ b/testing/integration-tests/src/light_client/mod.rs @@ -29,13 +29,10 @@ use crate::utils::node_runtime; use codec::Compact; -use subxt::{ - client::{LightClient, LightClientBuilder, OnlineClientT}, - config::PolkadotConfig, -}; +use subxt::{client::OnlineClient, config::PolkadotConfig, lightclient::LightClient}; use subxt_metadata::Metadata; -type Client = LightClient; +type Client = OnlineClient; // Check that we can subscribe to non-finalized blocks. async fn non_finalized_headers_subscription(api: &Client) -> Result<(), subxt::Error> { @@ -119,9 +116,11 @@ async fn dynamic_events(api: &Client) -> Result<(), subxt::Error> { #[tokio::test] async fn light_client_testing() -> Result<(), subxt::Error> { - let api: LightClient = LightClientBuilder::new() - .build_from_url("wss://rpc.polkadot.io:443") - .await?; + let chainspec = subxt::utils::fetch_chainspec_from_rpc_node("wss://rpc.polkadot.io:443") + .await + .unwrap(); + let (_lc, rpc) = LightClient::relay_chain(chainspec.get())?; + let api = Client::from_rpc_client(rpc).await?; non_finalized_headers_subscription(&api).await?; finalized_headers_subscription(&api).await?; diff --git a/testing/integration-tests/src/utils/node_proc.rs b/testing/integration-tests/src/utils/node_proc.rs index ae64ba8ce0..c49d5edb6a 100644 --- a/testing/integration-tests/src/utils/node_proc.rs +++ b/testing/integration-tests/src/utils/node_proc.rs @@ -11,9 +11,6 @@ use subxt::{ Config, OnlineClient, }; -#[cfg(lightclient)] -use subxt::client::{LightClient, LightClientBuilder}; - /// Spawn a local substrate node for testing subxt. pub struct TestNodeProcess { // Keep a handle to the node; once it's dropped the node is killed. @@ -24,12 +21,7 @@ pub struct TestNodeProcess { legacy_client: RefCell>>, rpc_client: rpc::RpcClient, - - #[cfg(fullclient)] client: OnlineClient, - - #[cfg(lightclient)] - client: LightClient, } impl TestNodeProcess @@ -92,16 +84,9 @@ where /// will use the legacy backend by default or the unstable backend if the /// "unstable-backend-client" feature is enabled, so that we can run each /// test against both. - #[cfg(fullclient)] pub fn client(&self) -> OnlineClient { self.client.clone() } - - /// Returns the subxt client connected to the running node. - #[cfg(lightclient)] - pub fn client(&self) -> LightClient { - self.client.clone() - } } /// Construct a test node process. @@ -198,7 +183,7 @@ async fn build_rpc_client(ws_url: &str) -> Result { async fn build_legacy_client( rpc_client: rpc::RpcClient, ) -> Result, String> { - let backend = legacy::LegacyBackend::new(rpc_client); + let backend = legacy::LegacyBackend::builder().build(rpc_client); let client = OnlineClient::from_backend(Arc::new(backend)) .await .map_err(|e| format!("Cannot construct OnlineClient from backend: {e}"))?; @@ -232,49 +217,46 @@ async fn build_unstable_client( } #[cfg(lightclient)] -async fn build_light_client(proc: &SubstrateNode) -> Result, String> { +async fn build_light_client(proc: &SubstrateNode) -> Result, String> { + use subxt::lightclient::{ChainConfig, LightClient}; + // RPC endpoint. let ws_url = format!("ws://127.0.0.1:{}", proc.ws_port()); - // Step 1. Wait for a few blocks to be produced using the subxt client. + // Wait for a few blocks to be produced using the subxt client. let client = OnlineClient::::from_url(ws_url.clone()) .await .map_err(|err| format!("Failed to connect to node rpc at {ws_url}: {err}"))?; - // Wait for at least 3 blocks before starting the light client. + // Wait for at least 3 blocks before starting the light client. // Otherwise, the lightclient might error with // `"Error when retrieving the call proof: No node available for call proof query"`. super::wait_for_number_of_blocks(&client, 4).await; - // Step 2. Construct the light client. - // P2p bootnode. + + // Now, configure a light client; fetch the chain spec and modify the bootnodes. let bootnode = format!( "/ip4/127.0.0.1/tcp/{}/p2p/{}", proc.p2p_port(), proc.p2p_address() ); - let mut result = LightClientBuilder::new() - .bootnodes([bootnode.as_str()]) - .build_from_url(ws_url.as_str()) + let chain_spec = subxt::utils::fetch_chainspec_from_rpc_node(ws_url.as_str()) .await - .map_err(|e| format!("Failed to construct light client {}", e)); + .map_err(|e| format!("Failed to obtain chain spec from local machine: {e}"))?; - for _ in 0..3 { - if let Err(e) = &result { - if e.contains("Error when retrieving the call proof") { - tokio::time::sleep(std::time::Duration::from_secs(5)).await; + let chain_config = ChainConfig::chain_spec(chain_spec.get()) + .set_bootnodes([bootnode.as_str()]) + .map_err(|e| format!("Light client: cannot update boot nodes: {e}"))?; - result = LightClientBuilder::new() - .bootnodes([bootnode.as_str()]) - .build_from_url(ws_url.as_str()) - .await - .map_err(|e| format!("Failed to construct light client {}", e)); - } - } else { - break; - } - } + // Instantiate the light client. + let (_lightclient, rpc) = LightClient::relay_chain(chain_config) + .map_err(|e| format!("Light client: cannot add relay chain: {e}"))?; - result + // Instantiate subxt client from this. + let api = OnlineClient::from_rpc_client(rpc) + .await + .map_err(|e| format!("Failed to build OnlineClient from light client RPC: {e}"))?; + + Ok(api) } diff --git a/testing/no-std-tests/Cargo.lock b/testing/no-std-tests/Cargo.lock index ee4afadfe7..5414290a17 100644 --- a/testing/no-std-tests/Cargo.lock +++ b/testing/no-std-tests/Cargo.lock @@ -32,6 +32,21 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "bip39" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f" +dependencies = [ + "bitcoin_hashes", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" + [[package]] name = "blake2b_simd" version = "1.0.2" @@ -101,6 +116,34 @@ dependencies = [ "typenum", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "platforms", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -122,6 +165,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] @@ -130,6 +174,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "fiat-crypto" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" + [[package]] name = "frame-metadata" version = "16.0.0" @@ -151,6 +201,15 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom_or_panic" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9" +dependencies = [ + "rand_core", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -161,6 +220,21 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "impl-trait-for-tuples" version = "0.2.2" @@ -209,6 +283,18 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core", + "zeroize", +] + [[package]] name = "once_cell" version = "1.19.0" @@ -239,6 +325,21 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", +] + +[[package]] +name = "platforms" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -277,6 +378,37 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "regex" +version = "1.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +dependencies = [ + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + [[package]] name = "rustc_version" version = "0.4.0" @@ -288,9 +420,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +checksum = "2ef2175c2907e7c8bc0a9c3f86aeb5ec1f3b275300ad58a44d0c3ae379a5e52e" dependencies = [ "cfg-if", "derive_more", @@ -310,6 +442,32 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "schnorrkel" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de18f6d8ba0aad7045f5feae07ec29899c1112584a38509a84ad7b04451eaa0" +dependencies = [ + "arrayref", + "arrayvec", + "curve25519-dalek", + "getrandom_or_panic", + "merlin", + "rand_core", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "zeroize", +] + [[package]] name = "semver" version = "1.0.21" @@ -338,10 +496,10 @@ dependencies = [ ] [[package]] -name = "sp-core-hashing" -version = "15.0.0" +name = "sp-crypto-hashing" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0f4990add7b2cefdeca883c0efa99bb4d912cb2196120e1500c0cc099553b0" +checksum = "bc9927a7f81334ed5b8a98a4a978c81324d12bd9713ec76b5c68fd410174c5eb" dependencies = [ "blake2b_simd", "byteorder", @@ -357,6 +515,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + [[package]] name = "subxt-core-no-std-tests" version = "0.0.0" @@ -364,18 +528,38 @@ dependencies = [ "libc_alloc", "parity-scale-codec", "subxt-metadata", + "subxt-signer", ] [[package]] name = "subxt-metadata" -version = "0.34.0" +version = "0.35.0" dependencies = [ "derive_more", "frame-metadata", "hashbrown", "parity-scale-codec", "scale-info", - "sp-core-hashing", + "sp-crypto-hashing", +] + +[[package]] +name = "subxt-signer" +version = "0.35.0" +dependencies = [ + "bip39", + "cfg-if", + "derive_more", + "hex", + "hmac", + "parity-scale-codec", + "pbkdf2", + "regex", + "schnorrkel", + "secrecy", + "sha2", + "sp-crypto-hashing", + "zeroize", ] [[package]] @@ -485,3 +669,23 @@ dependencies = [ "quote", "syn 2.0.48", ] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] diff --git a/testing/no-std-tests/Cargo.toml b/testing/no-std-tests/Cargo.toml index 503326d5b5..8e53afbb0a 100644 --- a/testing/no-std-tests/Cargo.toml +++ b/testing/no-std-tests/Cargo.toml @@ -7,6 +7,7 @@ resolver = "2" [dependencies] subxt-metadata = { path = "../../metadata", default-features = false } +subxt-signer = { path = "../../signer", default-features = false, features = ["sr25519"] } codec = { package = "parity-scale-codec", version = "3.6.9", default-features = false, features = ["derive"] } libc_alloc = { version = "1.0.6" } diff --git a/testing/no-std-tests/src/main.rs b/testing/no-std-tests/src/main.rs index 09d8775fc5..479ff581b3 100644 --- a/testing/no-std-tests/src/main.rs +++ b/testing/no-std-tests/src/main.rs @@ -34,14 +34,27 @@ extern crate alloc; /// Including code here makes sure it is not pruned. /// We want all code included to compile fine for the `thumbv7em-none-eabi` target. fn compile_test() { - subxt_metadata_compiles(); -} - -fn subxt_metadata_compiles() { + // Subxt Metadata compiles: use codec::Decode; let bytes: alloc::vec::Vec = alloc::vec![0, 1, 2, 3, 4]; subxt_metadata::Metadata::decode(&mut &bytes[..]).expect_err("invalid byte sequence"); const METADATA: &[u8] = include_bytes!("../../../artifacts/polkadot_metadata_small.scale"); subxt_metadata::Metadata::decode(&mut &METADATA[..]).expect("should be valid metadata"); + + // Subxt Signer compiles: + use subxt_signer::sr25519; + let keypair = sr25519::dev::alice(); + let message = b"Hello!"; + let _signature = keypair.sign(message); + let _public_key = keypair.public_key(); + + // Note: `ecdsa` is not compiling for the `thumbv7em-none-eabi` target. + // + // use subxt_signer::ecdsa; + // let keypair = ecdsa::dev::alice(); + // let message = b"Hello!"; + // let _signature = keypair.sign(message); + // let _public_key = keypair.public_key(); + // } diff --git a/testing/wasm-lightclient-tests/Cargo.lock b/testing/wasm-lightclient-tests/Cargo.lock index 49094a0384..58b700e67e 100644 --- a/testing/wasm-lightclient-tests/Cargo.lock +++ b/testing/wasm-lightclient-tests/Cargo.lock @@ -455,12 +455,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.3" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" dependencies = [ - "darling_core 0.20.3", - "darling_macro 0.20.3", + "darling_core 0.20.8", + "darling_macro 0.20.8", ] [[package]] @@ -479,9 +479,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" dependencies = [ "fnv", "ident_case", @@ -504,11 +504,11 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ - "darling_core 0.20.3", + "darling_core 0.20.8", "quote", "syn 2.0.48", ] @@ -589,9 +589,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "equivalent" @@ -1114,18 +1114,18 @@ checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "js-sys" -version = "0.3.67" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] [[package]] name = "jsonrpsee" -version = "0.21.0" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9579d0ca9fb30da026bac2f0f7d9576ec93489aeb7cd4971dd5b4617d82c79b2" +checksum = "87f3ae45a64cfc0882934f963be9431b2a165d667f53140358181f262aca0702" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -1135,9 +1135,9 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.21.0" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9f9ed46590a8d5681975f126e22531698211b926129a40a2db47cbca429220" +checksum = "455fc882e56f58228df2aee36b88a1340eafd707c76af2fa68cf94b37d461131" dependencies = [ "futures-channel", "futures-util", @@ -1158,9 +1158,9 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.21.0" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "776d009e2f591b78c038e0d053a796f94575d66ca4e77dd84bfc5e81419e436c" +checksum = "b75568f4f9696e3a47426e1985b548e1a9fcb13372a5e320372acaf04aca30d1" dependencies = [ "anyhow", "async-lock", @@ -1183,9 +1183,9 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.21.0" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b7de9f3219d95985eb77fd03194d7c1b56c19bce1abfcc9d07462574b15572" +checksum = "9e7a95e346f55df84fb167b7e06470e196e7d5b9488a21d69c5d9732043ba7ba" dependencies = [ "async-trait", "hyper", @@ -1203,9 +1203,9 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.21.0" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3266dfb045c9174b24c77c2dfe0084914bb23a6b2597d70c9dc6018392e1cd1b" +checksum = "3467fd35feeee179f71ab294516bdf3a81139e7aeebdd860e46897c12e1a3368" dependencies = [ "anyhow", "beef", @@ -1504,18 +1504,18 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", @@ -1616,9 +1616,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.76" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -2036,9 +2036,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] @@ -2054,9 +2054,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", @@ -2065,9 +2065,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -2272,10 +2272,10 @@ dependencies = [ ] [[package]] -name = "sp-core-hashing" -version = "13.0.0" +name = "sp-crypto-hashing" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb8524f01591ee58b46cd83c9dbc0fcffd2fd730dabec4f59326cd58a00f17e2" +checksum = "1e0f4990add7b2cefdeca883c0efa99bb4d912cb2196120e1500c0cc099553b0" dependencies = [ "blake2b_simd", "byteorder", @@ -2311,7 +2311,7 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "subxt" -version = "0.33.0" +version = "0.35.0" dependencies = [ "async-trait", "base58", @@ -2334,19 +2334,18 @@ dependencies = [ "scale-value", "serde", "serde_json", - "sp-core-hashing", + "sp-crypto-hashing", "subxt-lightclient", "subxt-macro", "subxt-metadata", "thiserror", - "tokio-stream", "tracing", "url", ] [[package]] name = "subxt-codegen" -version = "0.33.0" +version = "0.35.0" dependencies = [ "frame-metadata 16.0.0", "getrandom", @@ -2366,7 +2365,7 @@ dependencies = [ [[package]] name = "subxt-lightclient" -version = "0.33.0" +version = "0.35.0" dependencies = [ "futures", "futures-timer", @@ -2391,24 +2390,27 @@ dependencies = [ [[package]] name = "subxt-macro" -version = "0.33.0" +version = "0.35.0" dependencies = [ - "darling 0.20.3", + "darling 0.20.8", "parity-scale-codec", "proc-macro-error", + "quote", + "scale-typegen", "subxt-codegen", "syn 2.0.48", ] [[package]] name = "subxt-metadata" -version = "0.33.0" +version = "0.35.0" dependencies = [ + "derive_more", "frame-metadata 16.0.0", + "hashbrown", "parity-scale-codec", "scale-info", - "sp-core-hashing", - "thiserror", + "sp-crypto-hashing", ] [[package]] @@ -2441,18 +2443,18 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", @@ -2486,9 +2488,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.1" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", @@ -2774,9 +2776,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.90" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2784,9 +2786,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.90" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", @@ -2811,9 +2813,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.90" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2821,9 +2823,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.90" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", @@ -2834,9 +2836,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.90" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "wasm-bindgen-test" diff --git a/testing/wasm-lightclient-tests/tests/wasm.rs b/testing/wasm-lightclient-tests/tests/wasm.rs index 92ef3543bb..845ae94e82 100644 --- a/testing/wasm-lightclient-tests/tests/wasm.rs +++ b/testing/wasm-lightclient-tests/tests/wasm.rs @@ -1,10 +1,7 @@ #![cfg(target_arch = "wasm32")] use futures_util::StreamExt; -use subxt::{ - client::{LightClient, LightClientBuilder}, - config::PolkadotConfig, -}; +use subxt::{client::OnlineClient, config::PolkadotConfig, lightclient::LightClient}; use wasm_bindgen_test::*; wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser); @@ -49,15 +46,25 @@ async fn light_client_works() { /// We connect to an RPC node because the light client can struggle to sync in /// time to a new local node for some reason. Because this can be brittle (eg RPC nodes can /// go down or have network issues), we try a few RPC nodes until we find one that works. -async fn connect_to_rpc_node() -> LightClient { +async fn connect_to_rpc_node() -> OnlineClient { let rpc_node_urls = [ "wss://rpc.polkadot.io", "wss://1rpc.io/dot", "wss://polkadot-public-rpc.blockops.network/ws", ]; + async fn do_connect( + url: &str, + ) -> Result, Box> + { + let chainspec = subxt::utils::fetch_chainspec_from_rpc_node(url).await?; + let (_lc, rpc) = LightClient::relay_chain(chainspec.get())?; + let api = OnlineClient::from_rpc_client(rpc).await?; + Ok(api) + } + for url in rpc_node_urls { - let res = LightClientBuilder::new().build_from_url(url).await; + let res = do_connect(url).await; match res { Ok(api) => return api, diff --git a/testing/wasm-rpc-tests/Cargo.lock b/testing/wasm-rpc-tests/Cargo.lock index 8df1704f97..e2d2a7225a 100644 --- a/testing/wasm-rpc-tests/Cargo.lock +++ b/testing/wasm-rpc-tests/Cargo.lock @@ -2294,7 +2294,7 @@ dependencies = [ ] [[package]] -name = "sp-core-hashing" +name = "sp-crypto-hashing" version = "13.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb8524f01591ee58b46cd83c9dbc0fcffd2fd730dabec4f59326cd58a00f17e2" @@ -2362,7 +2362,7 @@ dependencies = [ "scale-value", "serde", "serde_json", - "sp-core-hashing", + "sp-crypto-hashing", "subxt-lightclient", "subxt-macro", "subxt-metadata", @@ -2434,7 +2434,7 @@ dependencies = [ "frame-metadata 16.0.0", "parity-scale-codec", "scale-info", - "sp-core-hashing", + "sp-crypto-hashing", "thiserror", ]